[PHP] namespace와 use


Study/PHP  2019. 10. 7. 23:53

안녕하세요. 명월입니다.


이 글은 PHP에서 사용되는 namespace와 use에 대한 설명입니다.

현재 CakePHP를 한창 분석해서 글을 올리고 있는데 뜬금없이 namespace와 use에 대한 설명으로 전환되었네요. namespace와 use는 CakePHP에서만 적용되는 키워드가 아니고 전체 PHP에서 사용되는 키워드입니다.


이 namespace와 use는 무엇이냐 하면 C#에서의 namespace와 using과 같고 Java에서의 package와 import와 같은 개념입니다.

점차 프로젝트가 커지고 많은 라이브러리를 참조해서 사용하는 최근 프로젝트에서 클래스 명이 전부 독립적으로 사용될 수는 없습니다. 예를 들면, 제가 데이터 베이스를 두 종류를 사용하는 시스템이라고 생각합니다.

그 두 종류는 mssql과 oracle이라고 가정하면, mssql connection 클래스와 oracle connection 클래스가 있을 때 이 두 클래스 이름은 Connection으로 같은 이름이라고 하면 선언할 때 어떤 클래스가 선언되는 지 알 수가 없어집니다.


다른 예로써 xml 데이터를 build하는 Convert 클래스가 있고 json 데이터를 build하는 Convert 클래스가 있을 때 new Convert할 때 어떤 클래스를 가르키는 지 알 수가 없습니다.

그렇게 되면 모두 다 고유 이름의 클래스 이름을 필요하게 되면, 최근 프로젝트에서 많은 라이브러리를 연결하여 사용하는 데 존재하는 많은 라이브러리들이 각자 고유의 클래스 이름을 지정해야 합니다.


그걸 극복하기 위해 있는 키워드가 namespace와 use입니다.

<?php
//namespace Test1에 속하는 TestClass
namespace Test1;
class TestClass {
  public function print(){
    return "Test1";
  }
}
//namespace Test2에 속하는 TestClass
namespace Test2;
class TestClass {
  public function print(){
    return "Test2";
  }
}

namespace App\Controller;
// Test1의 TestClass를 사용한다.
use Test1\TestClass;

class HomeController extends AppController
{
  public function index()
  {
    // 여기서 사용되는 TestClass는 use에서 지시했듯이 Test1 namespace의 TestClass이다.
    $this->set("data",new TestClass());
  }
}
{$data->print()}

제가 각각 namespace를 Test1과 Test2를 선언헀습니다. 여기서 index함수에서 제가 use를 Test1의 namespace의 TestClass를 선언했기 때문에 Test1의 namespace의 TestClass가 호출됩니다.

이번에는 use를 Test2\TestClass로 수정해 보겠습니다.

이번에는 결과값이 Test2로 나온 것을 보니, namespace Test2가 실행된 것을 알 수 있습니다.


이게 제가 중간에 설명한 이유는 초반에 namespace와 use의 설명이 크게 중요하지 않다고 생각해서 생략하려고 헀는데, CakePHP에서 Entity와 Bean등 생성 클래스들이 점점 많아지니깐 namespace와 use이 꽤 중요해졌네요.

없으면 플젝이 안 되겠네요.. 그래서 namespace와 use에 대해 조사를 해봤네요.


링크 - https://www.php.net/manual/en/language.namespaces.basics.php


여기까지 PHP에서 사용되는 namespace와 use에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.