Using namespaces: Aliasing/Importing

Оновлено: 11.05.2023

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Можливість посилатися на зовнішнє повне ім'я за допомогою псевдоніма, або імпортування, є важливою особливістю просторів імен. Це схоже на здатність файлових систем на базі 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
?>

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;

    // ...
}
?>

Зауважте:

Правила імпорту є індивідуальними для кожного файлу, тобто включені файли НЕ успадковують правила імпорту батьківського файлу.

Класи, функції та константи, імпортовані з одного простору імен, можна згрупувати в одному операторі використання.

<?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};