네임스페이스와 동적 언어 기능
네임스페이스와 동적 언어 기능 (Namespaces and dynamic language features)
PHP의 네임스페이스 구현은, PHP가 태생적으로 동적인 프로그래밍 언어라는 점에서 영향을 받았어요. 그래서 아래처럼 동적으로 요소에 접근하는 코드를 네임스페이스화된 코드로 바꿔야 할 때가 있는데요:
예시 1 — 요소에 동적으로 접근하기 (example1.php)
<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
이렇게 바꾸려면 완전히 한정된 이름(fully qualified name, 네임스페이스 접두사가 붙은 클래스 이름)을 사용해야 해요. 다만 동적 클래스 이름·함수 이름·상수 이름 안에서는 한정된 이름(qualified name)과 완전히 한정된 이름 사이에 차이가 없기 때문에, 맨 앞의 백슬래시(\)는 꼭 붙일 필요가 없어요.
예시 2 — 네임스페이스화된 요소에 동적으로 접근하기
<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
/* note that if using double quotes, "\\namespacename\\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced
그리고 하나 꼭 읽어두셔야 할 내용이 있어요. 문자열 안에서 네임스페이스 이름을 이스케이프할 때 주의할 점에 대한 노트인데, 아래 링크에서 확인해 주세요.