개요
PHP에서 네임스페이스(namespace)는 클래스, 함수, 상수의 이름 충돌을 방지하고 코드를 논리적으로 그룹화하는 강력한 기능입니다. 네임스페이스 내부에 클래스, 함수, 상수를 선언하면 해당 요소들의 접근 방식에 영향을 미치지만, 네임스페이스 안에는 이 외의 일반적인 PHP 코드도 함께 포함될 수 있습니다.
새로운 네임스페이스를 선언할 때는 PHP의 namespace 키워드를 사용합니다. 가장 중요한 규칙은 네임스페이스 선언문이 반드시 파일의 맨 앞에 위치해야 한다는 것입니다. 즉, .php 확장자를 가진 파일에서 <?php 태그 바로 다음 첫 번째 줄에 네임스페이스 선언이 있어야 하며, HTML 코드나 다른 스크립트보다 먼저 나와야 합니다.
네임스페이스 선언 예제
다음은 myspace라는 네임스페이스를 선언하고 그 안에 클래스와 함수를 정의하는 기본적인 예제입니다.
<?php
namespace myspace;
class myclass {
//
}
function hello() {
echo "Hello World\n";
}
?>위 코드처럼 네임스페이스 선언이 파일 최상단에 위치하면 아무 문제 없이 정상적으로 동작합니다.
선언 위치가 잘못된 경우 발생하는 오류
만약 네임스페이스 선언이 파일의 맨 위가 아닌 곳, 예를 들어 HTML 출력 코드 뒤에 위치하면 어떻게 될까요? PHP 파서는 치명적인 오류(fatal error)를 발생시킵니다.
잘못된 예제
<html>
<body>
Hello world
<?php
namespace myspace;
function hello() {
echo "Hello World\n";
}
use myspace;
myspace\hello();
?>
</body>
</html>실행 결과(오류 메시지)
PHP Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script
오류 메시지를 해석해 보면 "네임스페이스 선언문은 반드시 스크립트의 첫 번째 문장이거나, declare 호출 이후에 위치해야 합니다"라는 의미입니다.
예외: declare 구문은 네임스페이스 선언 전에 허용됨
네임스페이스 선언 앞에는 오직 declare 구문만 올 수 있다는 예외가 있습니다. 대표적으로 엄격한 타입 검사를 활성화하는 strict_types=1 선언이 있습니다.
정상 동작하는 예제
<?php
declare(strict_types=1);
namespace myspace;
function hello() {
echo "Hello World\n";
}
use myspace;
myspace\hello();
?>위 코드는 declare(strict_types=1);이 네임스페이스 선언보다 먼저 나왔기 때문에 오류 없이 정상적으로 실행됩니다.
정리
- 네임스페이스는
namespace키워드로 선언하며, 이름 충돌을 방지하고 코드 구조를 체계화합니다. - 네임스페이스 선언문은
<?php태그 직후 파일의 첫 번째 문장이어야 합니다. - HTML 등 다른 코드가 먼저 출력된 후 네임스페이스를 선언하면 PHP 치명적 오류가 발생합니다.
- 유일한 예외로
declare구문(예:strict_types=1)은 네임스페이스 선언 앞에 위치할 수 있습니다.