Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 네임스페이스(namespace) 키워드와 __NAMESPACE__ 상수 완벽 정리

개요

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 코드를 작성할 수 있습니다.