네임스페이스: 별칭 지정(Aliasing)/가져오기(Importing)
네임스페이스: 별칭 지정(Aliasing)/가져오기(Importing)
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
외부의 완전한 이름(fully qualified name)을 별칭으로 가리키거나 가져오는(importing) 기능은 네임스페이스에서 아주 중요한 특징이에요. 마치 유닉스 계열 파일시스템이 파일이나 디렉터리에 심볼릭 링크를 만드는 것과 비슷하다고 보면 돼요.
PHP는 상수, 함수, 클래스, 인터페이스, 트레이트, 이늄(enum), 네임스페이스까지 별칭을 지정하거나 가져올 수 있어요.
별칭 지정은 use 연산자로 해요. 종류별 가져오기를 보여 주는 예시를 함께 볼게요.
예제 #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는 여러 개의 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
또한 가져오기는 완전하지 않은 이름(unqualified)과 절대 이름이 아닌 이름(qualified)에만 영향을 줘요. 완전한 이름(fully qualified)은 절대 경로처럼 그 자체로 온전해서, 가져오기의 영향을 받지 않아요.
예제 #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;
// ...
}
참고: 가져오기 규칙은 파일 단위로 적용돼요. 즉 include된 파일은 부모 파일의 가져오기 규칙을 물려받지 않아요.
그룹 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 grouped 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};