Использование пространств имен: импорт/создание псевдонима имени
(PHP 5 >= 5.3.0)
Возможность ссылаться на внешнее абсолютное имя по псевдониму или импортирование
- это важная особенность пространств имен. Это похоже на возможность
файловых систем unix создавать символические ссылки на файл или директорию.
Пространства имен PHP поддерживают
три вида создания псевдонима имени или импорта: создание псевдонима для имени класса, создание псевдонима
для имени интерфейса и для имени пространства имен.
Обратите внимание, что импорт функций или констант не поддерживается.
В PHP создание псевдонима имени выполняется с помощью оператора use. Вот
пример, показывающий 3 типа импорта:
Пример #1 импорт/создание псевдонима имени с помощью оператора use
<?php
namespace foo;
use My\Full\Classname as Another;
// это тоже самое, что и использование My\Full\NSname как NSname
use My\Full\NSname;
// импортирование глобального класса
use ArrayObject;
$obj = new namespace\Another; // создает экземпляр класса foo\Another
$obj = new Another; // создает объект класса My\Full\Classname
NSname\subns\func(); // вызывает функцию My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // создает объект класса ArrayObject
// без выражения "use ArrayObject" мы создадим объект класса foo\ArrayObject
?>
Обратите внимание, что для имен в пространстве имен (абсолютные имена, содержащие
разделитель пространств имен, такие как
Foo\Bar, в отличие от глобальных имен,
которые его не содержат, такие как
FooBar) нет необходимости в начальном обратном слеше (\)
и его присутствие там не рекомендуется, так как импортируемые имена должны быть абсолютными и не обрабатываются
относительно текущего пространства имен.
PHP дополнительно поддерживает удобное сокращение для задания нескольких операторов use
в одной и той же строке
Пример #2 импорт/создание псевдонима имени с помощью оператора use, комбинирование нескольких операторов use
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // создает объект класса My\Full\Classname
NSname\subns\func(); // вызывает функцию My\Full\NSname\subns\func
?>
Импорт выполняется во время компиляции, и не влияет на имена динамических классов, функций
или констант.
Пример #3 Импорт и динамические имена
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // создает объект класса My\Full\Classname
$a = 'Another';
$obj = new $a; // создает объект класса Another
?>
В дополнение, импорт распространяется только на неполные и полные имена. Абсолютные имена
не затрагиваются операцией импорта.
Пример #4 Импортирование и абсолютные имена
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // создает объект класса My\Full\Classname
$obj = new \Another; // создает объект класса Another
$obj = new Another\thing; // создает объект класса My\Full\Classname\thing
$obj = new \Another\thing; // создает объект класса Another\thing
?>
Scoping rules for importing
Ключевое слово use должно быть указано в
самом начале файла (в глобальной области) или внутри объявления пространства
имен. Это необходимо потому, что импорт выполняется во время компиляции, а
не во время исполнения, поэтому оно не может быть заключено в блок.
Следующий пример показывает недопустимое применение
ключевого слова use:
Пример #5 Недопустимое правило импорта
<?php
namespace Languages;
class Greenlandic
{
use Languages\Danish;
...
}
?>
Замечание:
Правила импорта задаются на каждый файл отдельно. Это означает, что
присоединяемые файлы НЕ будут наследовать правила импорта
из родительского файла.