Возможность ссылаться на внешнее полное имя с помощью псевдонима или импорта — важная особенность пространств имен. Это похоже на способность файловых систем на базе Unix создавать символические ссылки на файл или каталог.
PHP может создавать псевдонимы (/импортировать) константы, функции, классы, интерфейсы и пространства имен.
Псевдоним выполняется с помощью use
оператора. Вот пример, показывающий все 5 видов импорта:
Пример #1 импорт/алиасинг с использованием оператора use
<?php
namespace foo;
use My\Full\Classname as Another;
// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;
// importing a global class
use ArrayObject;
// importing a function
use function My\Full\functionName;
// aliasing a function
use function My\Full\functionName as func;
// importing a constant
use const My\Full\CONSTANT;
$obj = new namespace\Another; // instantiates object of class foo\Another
$obj = new Another; // instantiates object of class My\Full\Classname
NSname\subns\func(); // calls function My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instantiates object of class ArrayObject
// without the "use ArrayObject" we would instantiate an object of class foo\ArrayObject
func(); // calls function My\Full\functionName
echo CONSTANT; // echoes the value of My\Full\CONSTANT
?>
Обратите внимание, что для имен пространств имен (полные имена пространств имен, содержащие разделитель пространств имен, например, Foo\Bar
в отличие от глобальных имен, которые его не содержат, например FooBar
), обратная косая черта в начале не нужна и не рекомендуется, поскольку имена импорта должны быть полностью определены и не обрабатываются. относительно текущего пространства имен.
PHP дополнительно поддерживает удобный ярлык для размещения нескольких операторов использования в одной строке.
Пример #2 Импорт/псевдоним с помощью оператора use, несколько объединенных операторов use
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantiates object of class My\Full\Classname
NSname\subns\func(); // calls function My\Full\NSname\subns\func
?>
Импорт выполняется во время компиляции и поэтому не влияет на имена динамических классов, функций или констант.
Пример #3 Импорт и динамические имена
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantiates object of class My\Full\Classname
$a = 'Another';
$obj = new $a; // instantiates object of class Another
?>
Кроме того, импорт затрагивает только неполные и полные имена. Полные имена являются абсолютными и не зависят от импорта.
Пример #4 Импорт и полные имена
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantiates object of class My\Full\Classname
$obj = new \Another; // instantiates object of class Another
$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
$obj = new \Another\thing; // instantiates object of class Another\thing
?>
Правила определения границ для импорта
Ключевое use
слово должно быть объявлено в самой внешней области действия файла (глобальной области) или внутри объявлений пространств имен. Это связано с тем, что импорт выполняется во время компиляции, а не во время выполнения, поэтому он не может быть блочным. В следующем примере показано незаконное использование use
ключевого слова:
Пример #5 Недопустимое правило импорта
<?php
namespace Languages;
function toGreenlandic()
{
use Languages\Danish;
// ...
}
?>
Примечание :
Правила импорта действуют для каждого файла, что означает, что включенные файлы НЕ будут наследовать правила импорта родительского файла.
use
объявления групп
Классы, функции и константы, импортируемые из одного и того же namespace
, могут быть сгруппированы вместе в одном use
операторе.
<?php
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// is equivalent to the following groupped use declaration
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
0 комментариев