들어가며
PHP에서 네임스페이스(namespace) 선언이 없는 경우, 클래스·함수·상수 등의 모든 정의는 전역 공간(global space)에 배치됩니다. 이는 네임스페이스가 도입되기 이전의 PHP 동작 방식과 동일합니다.
만약 이름 앞에 \(백슬래시)를 붙이면, 현재 네임스페이스 컨텍스트 안에 있더라도 해당 이름을 반드시 전역 공간에서 찾아오라는 의미가 됩니다. 이는 특히 PHP 내장 함수와 같은 이름의 함수를 네임스페이스 내에서 정의했을 때 유용합니다.
전역 공간 지정 문법 사용 예제
다음 예제는 네임스페이스 내에서 전역 공간의 fopen() 함수를 호출하는 방법을 보여줍니다.
<?php
namespace test;
/* 이 함수는 test\fopen 입니다 */
function fopen() {
/* ... */
$f = \fopen(...); // 전역 공간의 fopen 호출
return $f;
}
?>위 코드에서 \fopen(...)처럼 백슬래시를 붙이지 않으면 test\fopen(), 즉 현재 네임스페이스에 정의된 함수가 재귀적으로 호출될 수 있습니다. 반드시 구분해서 사용해야 합니다.
포함(include)된 파일과 네임스페이스
별도의 네임스페이스 선언이 없는 파일은 기본적으로 전역 네임스페이스에 속합니다. 다만 주의할 점은, 브레이스({}) 문법으로 선언된 네임스페이스 블록 내부에서 파일을 포함하면, 포함된 파일의 코드도 해당 네임스페이스의 일부로 취급된다는 것입니다.
현재 네임스페이스 이름을 확인하려면 매직 상수 __NAMESPACE__를 사용할 수 있으며, 전역 공간에서는 빈 문자열을 반환합니다.
예제 1: 전역 네임스페이스의 파일
#test1.php <?php echo __NAMESPACE__ . "\n"; ?>
이 파일을 단독으로 실행하면 전역 네임스페이스에 속하므로 빈 문자열이 출력됩니다.
예제 2: 네임스페이스 블록 안에서 포함하기
이번에는 위 파일을 다른 네임스페이스 블록 내부에서 포함해 보겠습니다.
#test2.php
<?php
namespace testspace {
include 'test1.php';
echo __NAMESPACE__ . "\n";
}
?>출력 결과
위 코드를 실행하면 다음과 같은 출력이 나타납니다.
testspace
포함된 test1.php의 echo __NAMESPACE__가 testspace를 출력한 것입니다. 이는 네임스페이스 블록 내부에서 포함된 파일이 그 네임스페이스를 상속받기 때문입니다. 이처럼 include 위치에 따라 네임스페이스 동작이 달라지므로, 파일을 포함할 때는 항상 현재 네임스페이스 컨텍스트를 염두에 두어야 합니다.