프로그래밍 언어/PHP

PHP: 네임스페이스

네임스페이스

네임스페이스는 분량은 짧지만 매우 x 2 중요합니다. 클래스와 함께 모던 PHP를 이루는 근간이며, composer 와 같은 패키지 매니저를 사용할 때 중요하게 작용하기 때문입니다. 이는 우리가 composer package 를 만들거나 할 때도 필요합니다.

 

이는 단순히 우리가 작성한 코드를 구역으로 나누는 것으로 같은 서드 파티, 또는 빌트인에 속하는 함수, 클래스와 중복을 고려하지 않고도 클래스나 함수의 이름을 지정해줄 수 있습니다. 네임스페이스를 사용하기 이전에는 중복을 피하기 위해 긴 함수, 클래스 이름을 사용하여 나타내야 했는데 이제는 그럴 필요가 없습니다.

namespace

네임스페이스는 naemspace 키워드를 사용하여 나타낼 수 있으며, 내부에는 함수와 클래스, 상수 등 여러가지가 올 수 있습니다. 네임스페이스는 하나의 구역이라고 생각할 수 있으며, 각각의 다른 구역을 가집니다. 하나의 파일 안에는 여러 개의 네임스페이스가 올 수 있지만, 가급적 하나의 파일에는 하나의 네임스페이스가 오는 것이 좋습니다.

namespace A;

function var_dump(...$expression)
{
    return __FUNCTION__;
}
위의 코드에서 기존에 존재하는 빌트인 함수인 var_dump() 를 작성한 것을 눈여겨 봐주세요! 코드가 구역으로 나뉘어 있기 때문에 에러가 전혀 나지 않고, 구역 내부에서 var_dump() 함수 호출시 구역 내부에 선언된 함수를 우선으로 합니다.

다중 네임스페이스

하나의 파일에 네임스페이스를 다수 사용하게 될 경우, 네임스페이스 키워드와 함께 중괄호를 사용하여 구분할 수 있습니다.

namespace A
{
}
namespace B
{
}

자식 네임스페이스

다른 네임스페이스의 자식 네임스페이스를 정의할 수 있습니다. 보통 함수, 클래스 등을 호출할 때 자식 네임스페이스 내부에서 찾지 못하면 상위 네임스페이스를 살펴보게 됩니다. 따라서 var_dump() 함수가 네임스페이스 내부에 정의되어 있다면 그것을 호출하지만, 찾지 못한다면 상위의 네임스페이스를 찾아 호출합니다.

namespace A\B;

class A
{
    public function foo()
    {
        return __METHOD__;
    }
}
자식 네임스페이스는 \ 를 구분자로 사용합니다. / 가 아니라는 것을 주의하십시오.

글로벌 네임스페이스

네임스페이스를 선언하지 않거나, namespace 키워드를 사용하되, 이름을 지정해주지 않았다면 글로벌 네임스페이스에 해당합니다. 이전 포스팅까지 우리는 글로벌 네임스페이스에서 모든 것을 해왔다고 해도 과언이 아닙니다.

namespace
{
}

다른 네임스페이스에 있는 요소 사용하기

다른 네임스페이스에 선언된 상수, 함수, 메서드, 클래스 등을 사용하려면 어떻게 해야 할까요? 다음의 예제코드를 보면 한 눈에 알 수 있습니다.

use

다른 네임스페이스를 포함시키거나, 내부에 소속된 것을 포함시키려면 use 키워드를 사용해야 합니다. 이는 주로 네임스페이스 선언 바로 아래에 위치하게 됩니다.

namespace
{
    use A\A;
    use A\B\A as AB;

    use function A\foo;
    use const A\MESSAGE;

    $a = new A();
    // $ab = new \A\B\A();
    // $ab = new AB();

    var_dump($a->foo(), foo(), MESSAGE);
}
new \A\B\A() 처럼 네임스페이스의 풀 패치를 사용하여 사용할 수도 있습니다.

use A\A

네임스페이스 A 아래에 있는 자식 네임스페이스 A 를 포함시킵니다. 이는 현재 네임스페이스의 구역을 변화시키지는 않습니다.

use A\B\A as AB

네임스페이스의 별칭을 부여합니다. 네임스페이스가 너무 길다면 별칭을 부여하여 간략하게 줄일 수 있습니다. 참고로 여기서 A\B\A 는 네임스페이스 A\B 아래에 있는 클래스 A 를 바라보고 있습니다.

use function A\foo

네임스페이스 A 아래에 있는 foo() 함수를 사용하겠다고 명시합니다.

use const A\MESSAGE

네임스페이스 A 아래에 있는 상수 MESSAGE 를 사용하겠다고 명시합니다.

PSR-4: Autoloader

PSR(PHP Standard Recommendation)에 포함된 권장안으로 네임스페이스 사용시 클래스를 자동으로 로딩할 수 있도록 가능하게 하게 하는 표준 권장안입니다. 핵심 내용은 파일 시스템 구조와 논리적 네임스페이스의 구조를 동일하게 맞춰서 일관성있게 코드를 작성하자는 취지입니다.

 

https://www.php-fig.org/psr/psr-4/

 

PSR-4: Autoloader - PHP-FIG

We're a group of established PHP projects whose goal is to talk about commonalities between our projects and find ways we can work better together.

www.php-fig.org

Autoloader 와 관련된 함수로는 __autoload(), spl_autoload_register() 등이 있습니다.

더 읽을거리

PHP: 에러와 예외 (try, catch, finally)

PHP: PSR(PHP Standard Recommendation)

https://www.inflearn.com/course/php7-reboot

https://www.inflearn.com/course/php7-oop

PHP 카테고리 목차 및 문서 정리

2020년, PHP 언어가 가지는 의미

https://www.php.net/manual/en/