네임스페이스 사용: 앨리어싱/가져오기

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

별칭을 사용하여 외부 정규화된 이름을 참조하거나 가져오는 기능은 네임스페이스의 중요한 기능입니다. 이것은 파일이나 디렉토리에 대한 심볼릭 링크를 생성하는 유닉스 기반 파일 시스템의 기능과 유사합니다.

PHP는 상수, 함수, 클래스, 인터페이스 및 네임스페이스를 alias(/import)할 수 있습니다.

앨리어싱은 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
?>
                  
                

네임스페이스 이름(FooBar와 같이 그렇지 않은 전역 이름과 대조적으로 Foo\Bar와 같이 네임스페이스 구분자를 포함하는 정규화된 네임스페이스 이름)의 경우 가져오기 이름이 정규화되어야 하므로 선행 백슬래시는 필요하지 않으며 권장되지 않습니다. 현재 네임스페이스와 관련하여 처리되지 않습니다. PHP는 같은 줄에 여러 use 문을 배치할 수 있는 편리한 바로 가기를 추가로 지원합니다.

예제 #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;

    // ...
}
?>
                  
                

메모: 가져오기 규칙은 파일을 기준으로 합니다. 즉, 포함된 파일은 상위 파일의 가져오기 규칙을 상속하지 않습니다.


Group use declarations

동일한 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};