개요
PHP에서 namespace 키워드는 네임스페이스를 정의할 때 사용됩니다. 흥미로운 점은 이 키워드가 단순한 선언문에 그치지 않고, 연산자(operator)로도 활용되어 현재 네임스페이스 내의 특정 요소에 접근할 수 있다는 것입니다. 또한 __NAMESPACE__ 상수는 현재 코드가 속해 있는 네임스페이스의 이름을 문자열로 반환합니다.
이 글에서는 __NAMESPACE__ 상수의 동작 방식과 namespace 연산자의 실제 활용법을 예제와 함께 자세히 살펴보겠습니다.
__NAMESPACE__ 상수란?
__NAMESPACE__는 PHP에서 제공하는 매직 상수(magic constant)로, 실행 시점에 현재 네임스페이스의 이름을 반환합니다.
- 네임스페이스가 지정된 경우: 해당 네임스페이스의 이름을 반환합니다.
- 전역(global) 또는 이름 없는 네임스페이스인 경우: 빈 문자열을 반환합니다.
예제 1 — 전역 네임스페이스
#test1.php <?php echo "전역 네임스페이스 이름 : " . __NAMESPACE__ . "\n"; ?>
전역 공간에서는 아래와 같이 빈 문자열이 출력됩니다.
전역 네임스페이스 이름 :
예제 2 — 이름이 지정된 네임스페이스
<?php namespace myspace; echo "현재 네임스페이스 이름 : " . __NAMESPACE__ . "\n"; ?>
반면 네임스페이스가 선언된 파일에서는 그 이름이 그대로 반환됩니다.
현재 네임스페이스 이름 : myspace
동적 클래스 이름 생성에 활용하기
__NAMESPACE__ 상수는 문자열을 조합하여 클래스나 함수의 이름을 동적으로 생성할 때 특히 유용합니다. 네임스페이스 경로를 하드코딩하지 않아도 되기 때문에 코드의 이식성과 유지보수성이 크게 향상됩니다.
예제
<?php
namespace MyProject;
class myclass {
function hello() { echo "hello world"; }
}
$cls = "myclass";
function get($cls) {
$a = __NAMESPACE__ . '\\' . $cls;
return new $a;
}
get($cls)->hello();
?>위 코드는 __NAMESPACE__ 값과 클래스명을 연결하여 완전한 클래스 이름(qualified name)을 만든 뒤 인스턴스를 생성합니다. 실행 결과는 다음과 같습니다.
hello world
namespace 연산자
namespace 키워드는 클래스 문맥에서 self 연산자와 유사한 역할을 합니다. 즉, 현재 네임스페이스 또는 그 하위 네임스페이스(sub-namespace)에 속한 요소를 명시적으로 참조할 수 있습니다.
예제 1 — 네임스페이스 내부에서 사용
<?php
namespace Myspace;
class myclass {
function hello() { echo "hello Myspace"; }
}
$a = new namespace\myclass();
$a->hello();
?>namespace\myclass()처럼 작성하면 현재 네임스페이스인 Myspace 안의 myclass를 가리키게 됩니다.
hello Myspace
예제 2 — 전역 네임스페이스에서 사용
전역 네임스페이스에서 namespace 연산자를 사용하면, 현재 네임스페이스(즉 전역 공간)에 정의된 클래스나 함수를 참조합니다.
<?php
class myclass {
function hello() { echo "hello global space"; }
}
$a = new namespace\myclass();
$a->hello();
?>hello global space
마무리
__NAMESPACE__ 상수와 namespace 연산자는 PHP의 네임스페이스 시스템을 더욱 유연하게 다룰 수 있게 해주는 도구입니다. 특히 오토로딩(autoloading) 구현이나 프레임워크 개발 시 동적 이름 해석이 필요한 상황에서 매우 유용하게 활용됩니다. 두 기능의 차이를 정확히 이해하고 적재적소에 사용한다면 더 깔끔하고 견고한 PHP 코드를 작성할 수 있습니다.