네임스페이스 – 04.use 문, as 연산자

외부 네임스페이스 가져오기

네임스페이스가 지정된 외부 문서를 내 문서로 인클루드include시키면 전체 네임스페이스 이름을 참조할 수 있습니다.

use 문

use 문을 이용하면 위와 같은 복잡한 계층hierarchy의 네임스페이스 이름을  짧은 이름으로 참조할 수 있습니다.

use 문에 as 연산자를 이용하면 네임스페이스 계층hierarchy이 포함된 매우 긴 이름의 클래스 대신에 더 짧은 이름의 별칭으로 임포팅importing할 수 있기 때문에 긴 이름 대신에 더 짧은 이름을 사용할 수 있어 문서를 단순화 시킬 수 있습니다.

use 네임스페이스-식별자 as 별칭;

짧은 이름의 별칭은 스크립트 문서가 실행될 때 원래의 이름인 네임스페이스 식별자로 변환됩니다.

use 문의 네임스페이스 식별자에서 마지막 세그먼트segment의 이름 Connection과 동일한 이름의 별칭을 사용할 경우에는 아래와 같이 as 이하의 구문을 생략할 수 있습니다.

네임스페이스 식별자를 별칭(또는 단축)으로 임포팅 하는 기능은 네임스페이스의 중요한 기능으로 이것은 파일이나 디렉토리에 대한 심볼릭 링크를 만드는 유닉스 기반 파일 시스템의 기능과 유사합니다.

PHP는 클래스, 인터페이스 및 네임스페이스를 use 문으로 임포팅 할 수 있습니다.

임포팅은 컴파일 시간에 수행되므로 동적 클래스, 함수, 상수 이름에 영향을 주지 않습니다.

use function, use const

PHP 5.6.0부터 함수와 상수 엘리먼트도 임포트 할 수 있도록 use function, use const 문이 추가되었습니다.

클래스, 함수, 상수는 별도의 네임 스페이스에 있기 때문에 상호간의 충돌conflict과 오버헤드overhead를 피하기 위해 use 키워드와 다른 use function, use const 키워드를 사용합니다.

이에 따라 네임스페이스 식별자와 별칭을 맵핑mapping해주는 임포트 테이블import table도 클래스, 함수, 상수가 별도의 테이블로 구성됩니다.

임포팅에 적용되는 스코핑 규칙

임포팅은 런타임이 아닌 컴파일 시간에 수행되므로 use 문은 전역 스코프global scope 또는 네임스페이스 내부에 선언되어야 하며, 함수 또는 클래스 내와 같은 블록 스코프block scope 내에 선언될 수 없습니다. 아래 예제는 use 키워드의 잘못된 사용 방법을 보여줍니다.

임포팅 규칙importing rule은 파일 단위로 적용되기 때문에 use 문에 의해 임포팅된 이름은 임포팅된 부분부터 현재 파일의 끝까지 영향을 미칩니다. 따라서 인클루드include된 파일은 상위parent 파일의 임포팅 규칙을 상속 받지 않습니다.

다중 use 및 그룹 use 문 선언

다중 use 문multiple use statement

PHP는 단일행에 여러 use 문을 배치하는 편리한 단축 기능을 지원합니다.

그룹 use 문group use statement

PHP 7.0부터 동일한 네임스페이스에서 가져오는 클래스, 함수 및 상수 엘리먼트element를 단일 use 문single use statement으로 그룹화 할 수 있습니다.

복합 use 문compound group use statement

PHP 7.0부터 동일한 네임스페이스의 서브네임스페이스에서 가져오는 클래스, 함수 및 상수 엘리먼트element를 단일 use 문single use statement으로 그룹화 할 수 있습니다.

혼합 use 문mixed group use statement

PHP 7.0부터 동일한 네임스페이스에서 가져오는 클래스, 함수 및 상수 엘리먼트element를 단일 use 문single use statement으로 혼합하여 그룹화 할 수 있습니다.

혼·복합 use 문mixed compound group use statement

PHP 7.0부터 동일한 네임스페이스의 서브네임스페이스에서 가져오는 클래스, 함수 및 상수 엘리먼트element를 단일 use 문single use statement으로 혼합하여 그룹화 할 수 있습니다.

임포트 이름에 의한 충돌 가능성

임포트된 이름은 동일한 네임스페이스에 등록된 이름과 충돌하지 않아야 합니다.

위 예제는 다른 네임스페이스에 정의된 클래스 thing의 임포트 별칭 MyClass에 의해 정상적으로 객체가 생성됩니다.

그러나 네임스페이스 my\stuff에 이미 클래스 MyClass가 정의되어 있는 경우, 다른 네임스페이스의 클래스를 MyClass로 임포트하게 되면 이름 충돌이 발생하여 Fatal 오류가 발생됩니다.

또한 다른 네임스페이스의 클래스를 MyClass라는 별칭으로 이미 임포트된 경우, 동일한 이름의 클래스를 현재 네임스페이스에 정의하면 이름 충돌이 발생합니다.

답글 남기기