네임스페이스 – 03.네임스페이스 정의

PHP 네임스페이스는 관련 클래스(추상 및 트레이트 포함), 인터페이스, 함수 및 상수 엘리먼트element를 그룹화하는 방법을 제공합니다.

모든 유효한 PHP 코드가 네임스페이스 내에 포함될 수 있지만 네임스페이스의 영향을 받는 코드 유형은 클래스(추상 및 트레이트 포함), 인터페이스, 함수 및 상수 엘리먼트element입니다.

네임스페이스는 namespace 키워드를 사용하여 선언됩니다. namespace 키워드에 이어 네임스페이스 식별자namespace identifier를 지정합니다.

namespace 네임스페이스-식별자;

네임스페이스 선언 위치

네임스페이스를 지정하려면 다른 코드보다 먼저 파일의 맨 위에 네임스페이스를 선언해야 합니다. 단 네임스페이스 선언 이전에는 공백문자whitespace를 포함하여 다음과 같은 PHP 요소만 허용됩니다.

  • declare 문statement
  • 공백문자whitespace
  • 주석comment

그러나 공백문자whitespace를 포함하여 PHP 코드가 아닌non-PHP 코드가 네임스페이스 선언 앞에 올 수 없습니다.

서브네임스페이스 선언

파일 시스템과 마찬가지로 네임스페이스도 계층 구조를 가지고 있어 서브네임스페이스sub-namespace를 지정할 수 있습니다.

위의 예제는 상수 MyProject\Component\Debug\CONNECT_OK, 클래스 MyProject\Component\Debug\Connection 및 함수 MyProject\Component\Debug\connect를 생성합니다.

아래는 클래스/함수/상수 엘리먼트element가 생성된 서브네임스페이스 Debug의 계층 구조를 보여줍니다.

네임스페이스 계층 구조

여러 파일에서 네임스페이스 공유

C++과 같은 다른 언어와 달리 PHP 5.3에서 제공하는 네임스페이스 기능은 스크립트 문서 단위로 이루어집니다.

동일한 네임스페이스를 서로 다른 문서에서 공유할 수 있기 때문에 여러 파일로 나누어 작업할 수 있습니다.

위 예제를 실행하게 되면 아래와 같은 결과를 얻을 수 있습니다.

다중 네임스페이스 정의

하나의 파일에서 여러 개의 네임스페이스multiple namespace를 선언 할 수도 있습니다. 허용되는 구문은 두 가지입니다. 첫 번째는 하나의 네임스페이스를 선언하는 방식대로 여러 개의 네임스페이스를 순서대로 나열할 수 있습니다.

이 구문은 권장되지 않는 방식이며, 대신 두 번째 방식으로 괄호 구문으로 대체하여 사용하는 것이 좋습니다.

여러 개의 PHP 스크립트를 조합할 때 하나의 파일에 여러 개의 네임스페이스를 정의하여 사용할 수는 있지만 일반적인 코딩 관행으로 볼 때 절대 권장되지 않습니다.

전역 코드global non-namespaced code를 네임스페이스가 지정된 코드와 조합하려면 괄호 구문을 사용해야 합니다. 이 때 전역 코드는 다음과 같이 이름이 없는 namespace 문에 넣어야 합니다.

네임스페이스 괄호를 벗어난 외부에는 declare 문을 제외한 다른 어떤 PHP 코드가 있어서는 안됩니다.

네임스페이스 식별자

네임스페이스 식별자identifier는 대소문자를 구분하지 않으며, “PHP”라는 이름의 네임스페이스나 (PHP\Classes와 같이) “PHP”로 시작되는 네임스페이스 이름은 PHP 언어에서 내부적으로 사용하기 위해 예약되어 있으므로 사용자 공간userspace의 코드에서 사용해서는 안됩니다.

실제로 실험해 본 바 “PHP” 또는 “PHP”로 시작되는 네임스페이스 식별자identifier도 오류 없이 정상적으로 선언할 수 있었습니다. 그러나 PHP에서 공식적으로 사용을 금하고 있으니 향후 호환성을 위해 사용하지 말아야 할 것입니다.

반면에 class, function, abstract, interface, const, namespace, new, public, __FILE__, static, echo, print, array, empty, eval, exit, isset, list, unset, include, require와 같은 언어 구조language construct와 관련된 식별자identifier가 네임스페이스에 포함되면 PHP 5, 7에서 Parse 오류가 발생됩니다.

그러나 이러한 공식화되지 않았던 제한사항이 PHP 8에서는 오류 없이 정상적으로 실행될 수 있도록 수정되었습니다.

네임스페이스를 선언할 때 백슬래시backslash로 시작하는 식별자identifier는 허용되지 않습니다.

  • (PHP 8) Parse error: syntax error, unexpected fully qualified name “\My\Component\Debug”, expecting “{“
  • (PHP 5.3~7) Fatal error: Uncaught Error: Undefined constant ‘My\Component\Debug’

네임스페이스에서 재정의할 수 없는 함수/상수

네임스페이스를 사용하면 다른 네임스페이스와의 충돌 없이 동일한 이름의 클래스/함수/상수 엘리먼트element를 정의하여 독립적으로 사용할 수 있습니다.

따라서 PHP 내장built-in 상수, 사용자 정의 상수도 네임스페이스 내에서 재정의하여 사용할 수 있습니다. 그러나 PHP 내장 함수/상수 중 일부 특수한 목적으로 미리 정의된 함수/상수의 경우는 재정의override 할 수 없습니다.

재정의 할 수 없는 함수

echo, print, array, empty, eval, exit, isset, list, unset, include, require와 같은 언어 구조language construct와 관련된 함수는 네임스페이스에 내에서 재정의override하게 되면 Parse 오류가 발생됩니다.

재정의 할 수 없는 상수

PHP 상수 중 NULL, TRUE, FALSE, ZEND_SREAD_SAFE 또는 ZEND_DEBUG_BUILD의 경우, 재정의override하게 되면 치명적인 오류가 발생됩니다.

답글 남기기