[PHP] 네임스페이스

[원본 링크]

php에도 네임스페이스가 있다.
사용 키워드는 namespace다.

각각 영어와 한국어를 사용하는 같은 이름의 함수 hello를, 네임스페이스를 통해 구분해보자

<?php
    namespace kor;
    function hello()
    {
        echo "안녕하시오<br>\n";
    }
?>

<?php
    namespace eng;
    function hello()
    {
        echo "Hello!<br>\n";
    }
?>

이렇게 구현할 수 있다.
네임스페이스를 선언하면 해당 네임스페이스는 또다른 네임스페이스가 선언되기 전까지 이어진다.

이제 이걸 index.php에서 포함해서 사용해보자.
네임스페이스에 대한 접근은 ''로 할 수 있다.

잘 된다.

그런데 여기서 사용한 네임스페이스는 좀 부족한 면이 있다.
kor와 eng도 운이 나쁘면 겹칠 수도 있는 이름이란 것이다. 이럴때는 \를 붙여서 네임스페이스를 2중, 3중으로 겹칠 수 있다.

<?php
    namespace lang\kor;
    function hello()
    {
        echo "안녕하시오<br>\n";
    }
?>

<?php
    namespace lang\eng;
    function hello()
    {
        echo "Hello!<br>\n";
    }
?>

그대로 잘 된다.

그런데, 저렇게 네임스페이스가 복잡하면 입력할때마다 너무 고통스러울 수 있다. 그럴때는 use 키워드를 사용하여 네임스페이스를 벗겨낸다.

그런데 php의 네임스페이스엔 제약이 좀 있다. 함수나 변수 등은 네임스페이스를 완전히 벗겨낼 수 없다는 것이다.
위의 코드에서
use lang\kor\hello;
를 하고
hello();를 호출하더라도 이건 작동하지 않고 에러를 뿜는다.

그래서 벗겨낼수 있는 대상은 클래스나, 네임스페이스 뿐이다.
기능이 왜이렇게 부실한건지..


아 그리고 use를 할때 as 키워드를 사용하면 네임스페이스나 클래스에 별명을 부여할 수 있다.
아래처럼


아 그리고 하나의 문법 제약이 있다. 네임스페이스를 선언할 경우에, 최초 네임스페이스 위에는 어떤 코드도 적으면 안된다는 것이다.
에러난다.