네임스페이스 – 06.엘리먼트 참조

네임스페이스 엘리먼트 참조

네임스페이스 엘리먼트element인 클래스/함수/상수를 참조할 때도 파일 시스템과 동일한 원리를 적용 할 수 있습니다.

1. 엘리먼트-이름unqualified name

네임스페이스 구분자namespace separator가 없이 네임스페이스 엘리먼트(클래스/함수/상수)의 이름만으로 구성된 식별자identifier입니다.

예를 들어 $a = new foo();와 같이 클래스 이름만 지정한 경우, 현재 네임스페이스가 currentnamespace이면 currentnamespace\foo로 처리됩니다.

foo가 currentnamespace에 정의되지 않은 엘리먼트인 경우에는 전역 공간global space에 있는 foo로 처리됩니다.

2. 상대-이름qualified name

네임스페이스 구분자namespace separator가 있는 식별자identifier입니다.

예를 들어 $a = new subnamespace\foo();와 같은 경우, 현재 네임스페이스가 currentnamespace이면 currentnamespace\subnamespace\foo로 처리됩니다.

명시된 네임스페이스가 없는non-namespaced 전역 공간에 있는 전역 코드global code 인 경우에는 subnamespace\foo로 처리됩니다.

3. 절대-이름fully qualified name

네임스페이스 구분자namespace separator로 시작하는 식별자identifier입니다.

예를 들어 $a = new \currentnamespace\foo();와 같이 전역 전위연산자global prefix operator 백슬래시backslash로 시작되는  절대 경로인 경우, 이것은 항상 전역 공간global space을 기준으로 하며, 문자에 표기된 이름 그대로 currentnamespace\foo로  처리됩니다.

절대-이름fully qualified name과 관련된 주의사항

namespace 문과 use 문에 지정된 네임스페이스 이름은 항상 전역 공간global space을 기준으로 처리되며, 현재 네임스페이스를 기준으로 처리되지 않습니다.

이와 관련하여 PHP는 아래와 같은 중첩 네임스페이스nested namespace를 허용하지 않습니다. 중첩 네임스페이스가 허용된다면, 중첩 네임스페이스의 내부 네임스페이스 이름은 상위 네임스페이스를 기준으로 변환되었을 것입니다.

중첩 네임스페이스를 지원하지 않는 PHP에서는 위와 같은 스크립트를 아래와 같이 시뮬레이션하게 됩니다.

PHP에서 namespace 문과 use 문 모두 네임스페이스 이름이 전역 공간global space을 기준으로 처리된다는 점에서는 동일하지만, 선행되는 백슬래시backslash인 전역 전위연산자global prefix operator의 표기 기준에 있어서는 서로 다른 기준을 가지고 있습니다.

namespace 문으로 네임스페이스를 선언할 때는 전역 전위연산자global prefix operator 백슬래시backslash를 허용하지 않습니다. 백슬래시로 시작하면 Parse 또는 Fatal 오류가 발생합니다.

use 문에서의 네임스페이스 이름은 전역 전위연산자global prefix operator인 백슬래시backslash의 표기 유무와 관계없이 절대-이름fully qualified name으로 간주되어 전역 공간global space을 기준으로 처리되기 때문에 선행 백슬래시를 표기하는 의미가 없습니다.

그렇지만 use 문에서는 백슬래시로 시작하는 네임스페이스 이름을 허용하고 있기 때문에 namespace 문과 달리 선행 백슬래시를 사용하였다고 오류가 발생하지 않고 정상적으로 실행됩니다.

그러나 PHP 공식 문서인 매뉴얼에 따르면, use 문에서 전역 공간에 있는 이름을 참조할 때를 제외하고는 백슬래시로 시작하는 이름을 권장하지 않기 때문에 서브네임스페이스를 표기할 때는 향후 코드의 호환성을 위해 백슬래시로 시작하는 이름을 사용하지 않는 것이 바람직합니다.

백슬래시로 참조된 상수와 관련된 주의사항

정의되지 않은 상수를 참조하게 되면 오류 메시지가 발생하게 되는데, 네임스페이스 식별자에 따라 다른 오류가 발생합니다.

엘리먼트-이름unqualified name, 즉 백슬래시가 없이 상수 이름만으로 구성된 경우에 정의되지 않은 상수를 참조하게 되면 단순히 Notice 메시지만 발생하게 됩니다.

그러나 상대-이름qualified name 또는 절대-이름fully qualified name, 즉 백슬래시를 포함하는 정의되지 않은 상수를 참조하게 되면 치명적인 오류가 발생됩니다.

답글 남기기