[PHP OOP] 5. 네임스페이스 (Namespaces)

정현섭·2021년 6월 23일
1

PHP OOP

목록 보기
5/6
  • Namespace는 모던 php의 근간을 이루는 부분이기 때문에 매우 중요하다.
    • class와 객체 기초, Abstraction 에 이어서 PHP OOP에서 가장 중요함.
    • 그 외의 것들은 사실 부가적인 부분이다.
  • 여러 package에서 쓰는 class의 이름이 겹칠때, Namespace로 이를 구분할 수 있다.
  • Namespace autoloading 개념이 나오는데 매우 중요하다.
  • 원래는 한 소스 파일당 하나의 namespace를 사용하지만, 여기서는 편의를 위해서 한 파일안에서 여러 namespace를 정의하여 사용해볼 것이다.

Example 1 : 기본 namespace 예제

namespace N1
{
    class A 
    {
        public function foo() {
            echo __METHOD__ . "\n";
        }
    }
}

namespace N2
{
    class A
    {
        public function foo() {
            echo __METHOD__ . "\n";
        }
    }
}

namespace 
{
    use N1\A ; //use N2\A
    $a = new A();
    $a->foo();
}
  • 위 코드의 결과로
  • use N1\A 를 했을 경우, N1\A::foo 가 출력 되고
  • use N2\A 를 했을 경우, N2\A::foo 가 출력 된다.
namespace 
{
    $a = new N1\A();
    $a->foo();
}
  • 위 처럼 use 를 쓰는대신 class에 namespace를 붙여서 사용해도 된다.
  • 그리고 Namespace 이름에 \ 를 이어붙여서 Hierarchical 하게 나타내는 방식을 많이 쓴다.

Exercise 2 : global namespace

namespace N
{
    function var_dump($a) {
        echo __NAMESPACE__ . "\n";
    }

    var_dump('aa'); // 'N'
    \var_dump('aa'); // 'string(2) "aa"'
}
  • 위 코드는 해당 namespace안에서 var_dump라는 함수를 정의하였을 때,
  • 명시적으로 global namespace의 var_dump 함수를 부르기 위해서는 \var_dump() 와 같이 써야 함을 보여준다.

Exercise 3 : 충돌 (같은 이름의 class를 use 할 때)

  • as 키워드를 사용하여 use로 불러오는 class의 이름을 바꿔준다. (별칭 붙이기.)
<?
namespace N1
{
    class A 
    {
        public function foo() {
            echo __METHOD__ . "\n";
        }
    }
}

namespace N2
{
    class A
    {
        public function foo() {
            echo __METHOD__ . "\n";
        }
    }
}

namespace 
{
    use N1\A as A1;
    use N2\A as A2;
}

Excercise 4 : 함수, 상수 가져오기

  • 앞선 예시까지는 use 를 이용해서 namespace안의 class만 가져왔다.
  • 각 각 use function , use const 를 이용하면 함수와 상수를 가져오는 것도 가능하다.
    • 근데 가져온다 는 워딩이 안 맞는 것 같다. 가져오는건 include() 에서 가져오는거고, use 키워드로는 가져와져 있는 class(혹은 function, const) 의 namespace를 제거해주는 역할을 한다.
namespace N1
{
    class A 
    {
    }

    const MESSAGE = "HI";

    function foo() {
        return 'FOO';
    }
}

namespace {
    use N1\A;

    use const N1\MESSAGE;
    use function N1\foo;

    echo MESSAGE;
    echo " ";
    echo foo();
}
  • 위 코드의 결과로 HI FOO 가 출력된다.

0개의 댓글