PHP 네 임 스페이스 상세 분석(namespace)

PHP 네 임 스페이스(namespace)는 PHP 5.3 에 추 가 됩 니 다.C\#와 자바 를 배 웠 다 면 네 임 스페이스 는 새로운 것 이 아 닙 니 다.하지만 PHP 에 서 는 상당히 중요 한 의 미 를 가진다.
PHP 네 임 스페이스 는 다음 과 같은 두 가지 문 제 를 해결 할 수 있 습 니 다.
  • 사용자 가 작성 한 코드 는 PHP 내부 의 클래스/함수/상수 또는 제3자 클래스/함수/상수 간 의 이름 과 충돌 합 니 다
  • 4.567917.긴 식별 자 이름(보통 첫 번 째 문 제 를 완화 하기 위해 정 의 된 것)에 별명(또는 짧 은 것)의 이름 을 만 들 고 소스 코드 의 가 독성 을 향상 시킨다네 임 스페이스 정의
    기본적으로 모든 상수,클래스,함수 이름 은 전체 공간 에 놓 여 있 으 며,PHP 가 네 임 스페이스 를 지원 하기 전과 같 습 니 다.
    네 임 스페이스 는 키워드 namespace 를 통 해 설명 합 니 다.파일 에 네 임 스페이스 가 포함 되 어 있다 면 다른 모든 코드 전에 네 임 스페이스 를 밝 혀 야 합 니 다.문법 형식 은 다음 과 같다.
    
    <?php 
    //       'MyProject'       
    namespace MyProject; 
     
    // ...    ... 
    같은 파일 에서 다른 네 임 스페이스 코드 를 정의 할 수 있 습 니 다.예 를 들 어:
    
    <?php 
    namespace MyProject;
    
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */ }
    
    namespace AnotherProject;
    
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */ }
    ?> 
    이 문법 을 사용 하여 한 파일 에 여러 개의 네 임 스페이스 를 정의 하 는 것 을 권장 하지 않 습 니 다.아래 의 대괄호 형식의 문법 을 사용 하 는 것 을 권장 합 니 다.
    
    <?php
    namespace MyProject {
     const CONNECT_OK = 1;
     class Connection { /* ... */ }
     function connect() { /* ... */ }
    }
    
    namespace AnotherProject {
     const CONNECT_OK = 1;
     class Connection { /* ... */ }
     function connect() { /* ... */ }
    }
    ?>
    전역 적 인 비 네 임 스페이스 의 코드 를 네 임 스페이스 의 코드 와 조합 하면 괄호 형식의 문법 만 사용 할 수 있 습 니 다.전역 코드 는 이름 이 없 는 namespace 문 구 를 괄호 로 묶 어야 합 니 다.예 를 들 어:
    
    <?php
    namespace MyProject {
    
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */ }
    }
    
    namespace { //     
    session_start();
    $a = MyProject\connect();
    echo MyProject\Connection::start();
    }
    ?>
    네 임 스페이스 를 설명 하기 전에 유일한 합 법 적 인 코드 는 원본 파일 인 코딩 방식 을 정의 하 는 declare 문 구 였 습 니 다.모든 비 PHP 코드 는 공백 부 호 를 포함 하여 네 임 스페이스 의 성명 전에 나타 날 수 없습니다.
    
    <?php
    declare(encoding='UTF-8'); //                     
    namespace MyProject {
    
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */ }
    }
    
    namespace { //     
    session_start();
    $a = MyProject\connect();
    echo MyProject\Connection::start();
    }
    ?>
    다음 코드 에 문법 오류 가 발생 할 수 있 습 니 다.
    
    <html>
    <?php
    namespace MyProject; //         “<html>”       -                  
    ?>
    하위 이름 공간
    디 렉 터 리 와 파일 의 관계 가 매우 비슷 하 며,PHP 네 임 스페이스 도 계층 화 된 네 임 스페이스 의 이름 을 지정 할 수 있 습 니 다.따라서 네 임 스페이스 의 이름 은 차원 별로 정의 할 수 있 습 니 다.
    
    <?php
    namespace MyProject\Sub\Level; //            
    
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function Connect() { /* ... */ }
    
    ?>
    위의 예 는 상수 MyProject\Sub\Level\\CONNECT 를 만 들 었 습 니 다.OK,클래스 MyProject\\Sub\Level\Connection 과 함수 MyProject\\Sub\\Level\\Connect.
    네 임 스페이스 사용
    PHP 네 임 스페이스 의 클래스 이름 은 세 가지 방식 으로 참조 할 수 있 습 니 다.
  • 한정 되 지 않 은 이름 이나 접두사 가 포함 되 지 않 은 클래스 이름,예 를 들 어$a=new foo();또는 foo::staticmethod();.현재 네 임 스페이스 가 currentnamespace 라면 foo 는 currentnamespace\\foo 로 분 석 됩 니 다.foo 코드 를 사용 하 는 것 이 전역 적 이 고 네 임 스페이스 에 포함 되 지 않 은 코드 라면 foo 는 foo 로 분 석 됩 니 다.경고:네 임 스페이스 의 함수 나 상수 가 정의 되 지 않 으 면 이 한정 되 지 않 은 함수 이름 이나 상수 이름 은 전역 함수 이름 이나 상수 이름 으로 해 석 됩 니 다
  • 이름 을 제한 하거나 접 두 사 를 포함 하 는 이름,예 를 들 어$a=new subnamespace\\foo();또는 subnamespace\\foo::staticmethod();.현재 네 임 스페이스 가 currentnamespace 라면 foo 는 currentnamespace\\subnamespace\\foo 로 분 석 됩 니 다.foo 코드 를 사용 하 는 것 이 전역 적 이 고 네 임 스페이스 에 포함 되 지 않 은 코드 라면 foo 는 subnamespace\\foo 로 분 석 됩 니 다
  • 이름 을 완전히 제한 하거나 전체 접두사 연산 자의 이름 을 포함 합 니 다.예 를 들 어$a=new\currentnamespace\foo();또는\currentnamespace\foo::staticmethod();.이러한 상황 에서 foo 는 항상 코드 의 문자 이름(literal name)currentnamespace\\foo 로 해 석 됩 니 다
  • 다음은 이 세 가지 방식 을 사용 한 실례 입 니 다.
    file1.php 파일 코드
    
    <?php
    namespace Foo\Bar\subnamespace; 
    
    const FOO = 1;
    function foo() {}
    class foo
    {
     static function staticmethod() {}
    }
    ?>
    file2.php 파일 코드
    
    <?php
    namespace Foo\Bar;
    include 'file1.php';
    
    const FOO = 2;
    function foo() {}
    class foo
    {
     static function staticmethod() {}
    }
    
    /*       */
    foo(); //       Foo\Bar\foo
    foo::staticmethod(); //      Foo\Bar\foo ,    staticmethod
    echo FOO; //       Foo\Bar\FOO
    
    /*      */
    subnamespace\foo(); //       Foo\Bar\subnamespace\foo
    subnamespace\foo::staticmethod(); //      Foo\Bar\subnamespace\foo,
             //        staticmethod
    echo subnamespace\FOO; //       Foo\Bar\subnamespace\FOO
             
    /*        */
    \Foo\Bar\foo(); //       Foo\Bar\foo
    \Foo\Bar\foo::staticmethod(); //      Foo\Bar\foo,        staticmethod
    echo \Foo\Bar\FOO; //       Foo\Bar\FOO
    ?>
    임의의 전역 클래스,함수 또는 상수 에 접근 하 는 것 을 주의 하 십시오.예 를 들 어\strlen()또는\\Exception 또는\INI 를 사용 할 수 있 습 니 다.ALL。
    네 임 스페이스 내부 에서 전역 클래스,함수,상수 에 접근 하기:
    
    <?php
    namespace Foo;
    
    function strlen() {}
    const INI_ALL = 3;
    class Exception {}
    
    $a = \strlen('hi'); //       strlen
    $b = \INI_ALL; //        INI_ALL
    $c = new \Exception('error'); //        Exception
    ?>
    네 임 스페이스 와 동적 언어 특징
    PHP 네 임 스페이스 의 실현 은 언어 자체 의 동적 특징의 영향 을 받는다.따라서 아래 코드 를 네 임 스페이스 로 변환 하려 면 동적 접근 요소 입 니 다.
    example 1.php 파일 코드:
    
    <?php
    class classname
    {
     function __construct()
     {
      echo __METHOD__,"
    "; } } function funcname() { echo __FUNCTION__,"
    "; } const constname = "global"; $a = 'classname'; $obj = new $a; // prints classname::__construct $b = 'funcname'; $b(); // prints funcname echo constant('constname'), "
    "; // prints global ?>
    이름 을 완전히 제한 해 야 합 니 다.동적 클래스 이름,함수 이름 또는 상수 이름 에서 이름 을 제한 하 는 것 과 이름 을 완전히 제한 하 는 것 은 다 르 지 않 기 때문에 선도 적 인 역 슬 래 쉬 는 불필요 합 니 다.
    동적 접근 네 임 스페이스 요소
    
    <?php
    namespace namespacename;
    class classname
    {
     function __construct()
     {
      echo __METHOD__,"
    "; } } function funcname() { echo __FUNCTION__,"
    "; } const constname = "namespaced"; include 'example1.php'; $a = 'classname'; $obj = new $a; // classname::__construct $b = 'funcname'; $b(); // echo constant('constname'), "
    "; // global /* , "\
    amespacename\\classname"*/ $a = '
    amespacename\classname'; $obj = new $a; // namespacename\classname::__construct $a = 'namespacename\classname'; $obj = new $a; // namespacename\classname::__construct $b = 'namespacename\funcname'; $b(); // namespacename\funcname $b = '
    amespacename\funcname'; $b(); // namespacename\funcname echo constant('
    amespacename\constname'), "
    "; // namespaced echo constant('namespacename\constname'), "
    "; // namespaced ?>
    namespace 키워드 와NAMESPACE__상수
    PHP 는 현재 네 임 스페이스 내부 요 소 를 추상 적 으로 접근 하 는 두 가지 방법 을 지원 합 니 다.NAMESPACE__ 마술 상수 와 namespace 키워드.
    상수NAMESPACE__현재 네 임 스페이스 이름 을 포함 하 는 문자열 입 니 다.전역 적 으로 네 임 스페이스 에 있 는 코드 는 포함 되 지 않 으 며 빈 문자열 을 포함 합 니 다.
    __NAMESPACE__ 예제,네 임 스페이스 에서 의 코드
    
    <?php
    namespace MyProject;
    
    echo '"', __NAMESPACE__, '"'; //    "MyProject"
    ?>
    __NAMESPACE__ 예제
    
    <?php
    
    echo '"', __NAMESPACE__, '"'; //    ""
    ?>
    상수NAMESPACE__ 동적 으로 이름 을 만 들 때 유용 합 니 다.예 를 들 어:
    사용NAMESPACE__동적 생 성 이름
    
    <?php
    namespace MyProject;
    
    function get($classname)
    {
     $a = __NAMESPACE__ . '\\' . $classname;
     return new $a;
    }
    ?>
    키워드 namespace 는 현재 네 임 스페이스 나 하위 네 임 스페이스 의 요 소 를 명시 적 으로 방문 할 수 있 습 니 다.그것 은 클래스 의 self 연산 자 와 같다.
    namespace 연산 자,네 임 스페이스 의 코드
    
    <?php
    namespace MyProject;
    
    use blah\blah as mine; // see "Using namespaces: importing/aliasing"
    
    blah\mine(); // calls function blah\blah\mine()
    namespace\blah\mine(); // calls function MyProject\blah\mine()
    
    namespace\func(); // calls function MyProject\func()
    namespace\sub\func(); // calls function MyProject\sub\func()
    namespace\cname::method(); // calls static method "method" of class MyProject\cname
    $a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
    $b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
    ?>
    namespace 연산 자,전역 코드
    
    <?php
    
    namespace\func(); // calls function func()
    namespace\sub\func(); // calls function sub\func()
    namespace\cname::method(); // calls static method "method" of class cname
    $a = new namespace\sub\cname(); // instantiates object of class sub\cname
    $b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
    ?>
    네 임 스페이스 사용:별명/가 져 오기
    PHP 네 임 스페이스 는 두 가지 별명 이나 가 져 오 는 방식 을 지원 합 니 다.클래스 이름 에 별명 을 사용 하거나 네 임 스페이스 이름 에 별명 을 사용 합 니 다.
    PHP 에서 별명 은 연산 자 use 를 통 해 이 루어 집 니 다.다음은 가능 한 세 가지 가 져 오기 방식 을 사용 하 는 예 입 니 다.
    1.use 연산 자 를 사용 하여 별명 가 져 오기/사용
    
    <?php
    namespace foo;
    use My\Full\Classname as Another;
    
    //        use My\Full\NSname as NSname   
    use My\Full\NSname;
    
    //        
    use \ArrayObject;
    
    $obj = new namespace\Another; //     foo\Another   
    $obj = new Another; //     My\Full\Classname   
    NSname\subns\func(); //      My\Full\NSname\subns\func
    $a = new ArrayObject(array(1)); //     ArrayObject   
    //       "use \ArrayObject" ,       foo\ArrayObject   
    ?>
    2.한 줄 에 여러 use 문 구 를 포함 합 니 다.
    
    <?php
    use My\Full\Classname as Another, My\Full\NSname;
    
    $obj = new Another; //     My\Full\Classname   
    NSname\subns\func(); //      My\Full\NSname\subns\func
    ?>
    가 져 오기 동작 은 컴 파일 에서 실행 되 지만 동적 클래스 이름,함수 이름 또는 상수 이름 은 아 닙 니 다.
    3.가 져 오기 와 동적 이름
    
    <?php
    use My\Full\Classname as Another, My\Full\NSname;
    
    $obj = new Another; //       My\Full\Classname   
    $a = 'Another';
    $obj = new $a;  //       Another   
    ?>
    또한 가 져 오기 동작 은 비 한정 명칭 과 한정 명칭 에 만 영향 을 미친다.이름 을 완전히 제한 하 는 것 은 확실 하기 때문에 가 져 오 는 영향 을 받 지 않 습 니 다.
    4.가 져 오기 및 완전 한정 이름
    
    <?php
    use My\Full\Classname as Another, My\Full\NSname;
    
    $obj = new Another; //     My\Full\Classname  
    $obj = new \Another; //     Another  
    $obj = new Another\thing; //     My\Full\Classname\thing  
    $obj = new \Another\thing; //     Another\thing  
    ?>
    네 임 스페이스 사용:전역 함수/상수 예비
    하나의 네 임 스페이스 에서 PHP 가 한정 되 지 않 은 클래스,함수 또는 상수 이름 을 만 났 을 때 다른 우선 정책 으로 이름 을 해석 합 니 다.클래스 이름 은 현재 네 임 스페이스 의 이름 을 항상 해석 합 니 다.따라서 시스템 내부 에 접근 하거나 네 임 스페이스 에 포함 되 지 않 은 클래스 이름 을 사용 할 때 완전히 제 한 된 이름 을 사용 해 야 합 니 다.예 를 들 어:
    1.네 임 스페이스 에서 전역 클래스 에 접근
    
    <?php
    namespace A\B\C;
    class Exception extends \Exception {}
    
    $a = new Exception('hi'); // $a    A\B\C\Exception      
    $b = new \Exception('hi'); // $b    Exception      
    
    $c = new ArrayObject; //     ,     A\B\C\ArrayObject  
    ?>
    함수 와 상수 의 경우 현재 네 임 스페이스 에 이 함수 나 상수 가 존재 하지 않 으 면 PHP 는 전역 공간의 함수 나 상수 로 물 러 갑 니 다.
    2.네 임 스페이스 에 준 비 된 전역 함수/상수
    
    <?php
    namespace A\B\C;
    
    const E_ERROR = 45;
    function strlen($str)
    {
     return \strlen($str) - 1;
    }
    
    echo E_ERROR, "
    "; // "45" echo INI_ALL, "
    "; // "7" - INI_ALL echo strlen('hi'), "
    "; // "1" if (is_array('hi')) { // "is not array" echo "is array
    "; } else { echo "is not array
    "; } ?>
    전역 공간
    네 임 스페이스 가 정의 되 지 않 으 면 모든 클래스 와 함수 의 정 의 는 전체 공간 에 있 습 니 다.PHP 가 네 임 스페이스 개념 을 도입 하기 전과 같 습 니 다.이름 앞 에 접 두 사 를 붙 여\\전역 공간의 이름 임 을 표시 합 니 다.이 이름 이 다른 네 임 스페이스 에 있 을 때 도 마찬가지 입 니 다.
    전역 공간 설명 사용
    
    <?php
    namespace A\B\C;
    
    /*       A\B\C\fopen */
    function fopen() { 
      /* ... */
      $f = \fopen(...); //      fopen  
      return $f;
    } 
    ?>
    네 임 스페이스 순서
    네 임 스페이스 가 생 긴 후부 터 가장 실수 하기 쉬 운 것 은 종 류 를 사용 할 때 이런 경 로 를 찾 는 것 이 어떤 것 입 니까?
    
    <?php
    namespace A;
    use B\D, C\E as F;
    
    //     
    
    foo();  //              "A"    foo()
       //           "foo"
    
    \foo();  //          "foo" 
    
    my\foo(); //          "A\my"    "foo" 
    
    F();  //              "A"     "F" 
       //           "F"
    
    //    
    
    new B(); //        "A"       "B"      
       //      ,         "A\B"
    
    new D(); //       ,       "B"       "D"      
       //      ,         "B\D"
    
    new F(); //       ,       "C"       "E"      
       //      ,         "C\E"
    
    new \B(); //              "B"      
       //      ,         "B"
    
    new \D(); //              "D"      
       //      ,         "D"
    
    new \F(); //              "F"      
       //      ,         "F"
    
    //                       
    
    B\foo(); //        "A\B"     "foo"
    
    B::foo(); //        "A"       "B"   "foo"   
       //        "A\B" ,         "A\B"
    
    D::foo(); //       ,       "B"       "D"   "foo"   
       //     "B\D"    ,         "B\D"
    
    \B\foo(); //        "B"      "foo" 
    
    \B::foo(); //           "B"   "foo"   
       //     "B"    ,         "B"
    
    //                
    
    A\B::foo(); //        "A\A"       "B"   "foo"   
        //     "A\A\B"    ,         "A\A\B"
    
    \A\B::foo(); //        "A"       "B"   "foo"   
        //     "A\B"    ,         "A\B"
    ?>
    이름 해석 은 다음 규칙 을 따 릅 니 다.
    1.이름 을 완전히 제한 하 는 함수,클래스 와 상수 의 호출 은 컴 파일 할 때 해석 합 니 다.예 를 들 어 new\A\B 는 클래스 A\B 로 분 석 됩 니 다.
    2.모든 비 한정 명칭 과 한정 명칭(비 완전 한정 명칭)은 현재 가 져 오기 규칙 에 따라 컴 파일 할 때 변환 합 니 다.예 를 들 어 네 임 스페이스 A\B\C 가 C 로 가 져 오 면 C\D\e()에 대한 호출 은 A\B\C\D\e()로 전 환 됩 니 다.
    3.네 임 스페이스 내부 에 가 져 오기 규칙 에 따라 바 뀌 지 않 은 모든 한정 이름 은 그 앞 에 현재 네 임 스페이스 이름 을 추가 합 니 다.예 를 들 어 네 임 스페이스 A\B 내부 에서 C\D\e()를 호출 하면 C\D\e()는 A\B\C\D\e()로 전 환 됩 니 다.
    4.비 한정 클래스 이름 은 현재 가 져 오기 규칙 에 따라 컴 파일 할 때 변환 합 니 다(짧 은 가 져 오기 이름 대신 전체 이름 으로).예 를 들 어 네 임 스페이스 A\B\C 를 C 로 가 져 오 면 new C()는 new A\B\C()로 전 환 됩 니 다.
    5.네 임 스페이스 내부(예 를 들 어 A\B)에서 한정 되 지 않 은 이름 의 함수 호출 은 실행 할 때 분 석 됩 니 다.예 를 들 어 함수 foo()호출 은 이렇게 해석 되 었 습 니 다.
    현재 네 임 스페이스 에서 A\B\foo()라 는 함 수 를 찾 습 니 다전체(global)공간의 함수 foo()를 찾 고 호출 하려 고 시도 합 니 다.
    6.네 임 스페이스(예 를 들 어 A\B)내부 에서 비 한정 이름 이나 한정 이름 클래스(비 완전 한정 이름)에 대한 호출 은 실행 할 때 분 석 됩 니 다.다음은 new C()및 new D\E()를 호출 하 는 분석 과정 입 니 다:new C()의 분석:
    현재 네 임 스페이스 에서 A\B\C 클래스 를 찾 습 니 다클래스 A\B\C 를 자동 으로 불 러 오 려 고 시도 합 니 다.
    new D\\E()의 해석:
  • 클래스 이름 앞 에 현재 네 임 스페이스 이름 을 추가 하면 A\B\D\E 로 바 뀌 고 이 종 류 를 찾 습 니 다
  • 클래스 A\B\D\E 를 자동 으로 불 러 옵 니 다.
    전역 네 임 스페이스 의 전역 클래스 를 참조 하기 위해 서 는 완전히 제 한 된 이름 new\C()를 사용 해 야 합 니 다.
    이상 은 PHP 네 임 스페이스(namespace)의 상세 한 내용 을 상세 하 게 분석 하 는 것 입 니 다.PHP 네 임 스페이스(namespace)에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기