>  기사  >  백엔드 개발  >  PHP 네임스페이스에 대한 간략한 소개

PHP 네임스페이스에 대한 간략한 소개

小云云
小云云원래의
2018-02-23 09:12:392864검색

1: 네임스페이스 개념: 네임스페이스는 디렉터리 및 파일과 유사하게 사물을 캡슐화하는 방법입니다.

네임스페이스로 해결된 문제(설명서도 매우 명확하게 작성되었으며 아래 내 이해에 따라 단순화되었습니다.):

1: 프로그램 작성자가 직접 작성한 클래스, 상수, 함수 및 PHP 내부 또는 제3자가 작성한 함수의 출현 해결 당사자 이름 충돌 상황.

2: 클래스, 상수, 함수의 이름이 너무 긴 문제를 해결하고 코드의 가독성을 높이는 데 도움이 되는 별칭을 만듭니다. 또한 일반적으로 첫 번째 유형의 문제를 완화하면 이름이 너무 길어지는 문제가 발생합니다.

둘: 네임스페이스를 정의하는 방법

1: 네임스페이스는 네임스페이스 키워드로 선언됩니다. 동시에 네임스페이스는 PHP가 아닌 코드 및 공백 문자를 포함한 다른 코드 앞에 위치해야 합니다(선언 키워드 제외). php), 그렇지 않으면 치명적인 오류가 발생합니다.

예:

<?php 
namespace Index; 
?>

참고 1: 네임스페이스 앞에 코드나 공백이 없는데도 여전히 치명적인 오류가 발생하는 경우 BOM 헤더로 인해 발생한 것입니다.
참고 2: 모든 합법적인 PHP 코드는 네임스페이스 아래에 배치될 수 있지만 네임스페이스의 영향을 받는 클래스(추상 클래스 및 특성), 인터페이스, 상수 및 함수만 해당됩니다.

2: 디렉터리와 파일 간의 관계와 마찬가지로 PHP 네임스페이스를 사용하면 계층적 네임스페이스 이름을 지정할 수도 있습니다. 따라서 네임스페이스 이름은 .

예:

<?php 
namespace Index\Col\File; 
define(&#39;MESSAGE&#39;,&#39;hello world&#39;); 
?>

3: 하나의 파일에 여러 네임스페이스를 정의할 수 있습니다. 두 가지 정의 구문이 있는데, 하나는 단순 조합 구문이고, 다른 하나는 중괄호 형식 구문이고, 다른 파일은 여러 네임스페이스를 정의합니다. 일반적으로 여러 파일을 하나의 파일로 병합하는 시나리오이지만 꼭 필요한 경우가 아니면 코드가 복잡해지고 가독성이 떨어지므로 이 방법을 사용하지 않는 것이 가장 좋습니다.

간단한 조합 구문:

<?php 
namespace Index; 
const INSTANCE=1; 
 
namespace Col; 
const INSTANCE=2; 
?>

Braces 구문, 하나의 파일에 여러 개의 네임스페이스가 있습니다. 네임스페이스가 아닌 코드를 작성해야 하는 경우 중괄호 구문만 사용할 수 있으며, 네임스페이스가 아닌 코드는 네임스페이스를 사용하여 이름이 지정되지 않은 네임스페이스를 선언합니다. , 다음 중괄호를 사용하세요.

<?php 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=1; 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=2; 
} 
 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=3; 
} 
?>

4: 여러 개의 서로 다른 파일이 동일한 네임스페이스를 정의할 수 있습니다. 즉, 동일한 네임스페이스의 콘텐츠가 여러 개의 서로 다른 파일에 저장될 수 있습니다.

세 가지: 네임스페이스 식별 원칙

네임스페이스 사용 원칙이 사용되는 경우는 세 가지가 있습니다. 실제로는 설명서에 자세히 설명되어 있지만 번역 문제로 인해 약간의 혼란이 생길 ​​수 있습니다. 여기서는 단순화하여 직접 사용하겠습니다. 정리하는 예:

1: 정규화된 이름이 없습니다. 즉, 읽으려는 클래스, 상수, 함수, 인터페이스의 이름을 직접 사용합니다. 컨텐츠가 속한 네임스페이스의 인터페이스 이름을 읽어오지만, 네임스페이스에 관련 이름이 없는 경우 데이터가 클래스 또는 인터페이스 이름인 경우 함수 또는 상수, 전역인 경우 치명적인 오류가 반환됩니다. 함수와 상수는 자동으로 읽혀집니다. 전역 함수나 상수가 없으면 치명적인 오류가 보고됩니다.

다음 예:

<?php 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=1; 
 
  function test(){ 
    echo 1; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 1; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出来的是1 
 
  test();       //输出1 
 
  foo::fool();      //输出1 
 
} 
 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=2; 
 
  function test(){ 
    echo 2; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 2; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出来的是2 
 
  test();     //输出2 
 
  foo::fool();    //输出2 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=3; 
 
  function test(){ 
    echo 3; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 3; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出来的是3 
 
  test();     //输出2 
   
  foo::fool();    //输出2 
} 
?>

위 예에서 각 네임스페이스 출력에는 정규화된 이름이 없으므로 현재 네임스페이스에 설정된 해당 데이터 값을 가져옵니다.

현재 네임스페이스가 설정되지 않은 경우 함수와 상수는 전역적으로 설정된 해당 데이터 값을 읽습니다. 해당 전역 설정이 없는 경우에만 치명적인 오류가 보고됩니다. 클래스와 인터페이스는 다음과 같이 직접 치명적인 오류를 보고합니다. 다음 코드.

<?php 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=1;  
  function test(){ 
    echo 1; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 1; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出来的是1  
  test();     //输出1  
  foo::fool();    //输出1  
} 
 
/*命名空间Index*/ 
namespace Index{ 
  var_dump(INSTANCE);   //打印出来的是1  
  test();     //输出1  
  foo::fool();    //fatal error 
 
} 
?>

2: 한정된 이름은 두 가지 상황으로 나누어집니다. 하나는 접두사를 포함하는 한정된 이름의 경우이고, 다른 하나는 전역 한정된 이름을 포함하는 경우입니다. 매뉴얼에서는 이 두 가지 유형을 별도로 분리하지만 이 두 가지를 함께 결합할 수 있다고 생각합니다. 둘 다 한정된 이름을 가지고 있지만 전자는 글로벌 한정을 갖고 있지 않은 반면 후자는 글로벌 한정을 가지고 있습니다.

① 접두사를 포함하는 정규화된 이름입니다. 이 접두사는 여러 개 또는 하나의 수준을 가질 수 있지만 가장 왼쪽은 전역 한정자가 될 수 없습니다. 이 경우 코드가 있는 네임스페이스에 해당하는 데이터와 접두사 한정 이름이 포함됩니다. 즉,

이 있는 네임스페이스는 접두사 한정 이름으로 읽습니다. 코드에 전역 네임스페이스가 없으면 접두사 한정 이름으로 직접 읽습니다. 접두사로 한정된 이름.

예제 코드:

<?php 
/*命名空间Col\Index*/ 
namespace Col\Index{ 
  const INSTANCE=1; 
} 
 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=2; 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=3; 
  var_dump(Index\INSTANCE); //打印出来的是1 读取的是Col\Index\INSTANCE 
} 
 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=4; 
  var_dump(Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE 
} 
 
?>

②전역 한정 접두사 이름: 즉, 맨 왼쪽의 전역 연산자에 의해 수정된 접두사 한정 이름입니다. 물론 접두사 한정 없이 이름에 전역 연산자를 직접 추가하는 것도 가능합니다. . 그러나 전역 연산자를 추가한 후에는 디렉터리의 절대 경로와 동일하며 전역 한정 후 설정에 따라서만 읽혀집니다.

구체적인 예는 다음과 같습니다.

<?php 
/*命名空间Col\Index*/ 
namespace Col\Index{ 
  const INSTANCE=1; 
} 
 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=2; 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=3; 
  var_dump(\Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE 
} 
 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=4; 
  var_dump(\Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE 
} 
 
namespace Lin{ 
  const INSTANCE=5; 
  var_dump(\INSTANCE); //打印出来的是4 读取的是INSTANCE,是全局非命名空间里的INSTANCE,如果没有全局操作符\,读取的会是当前命名空间的Lin\INSTANCE=5 
} 
 
?>

Four: 문자열의 네임스페이스 이스케이프

때때로 네임스페이스가 문자열에 사용되는 경우 작은 따옴표인 경우 컴파일러에서 해석되지 않으므로 문제가 없습니다. 큰따옴표인 경우 예상치 못한 상황이 발생할 수 있습니다. 큰따옴표 안의 내용은 컴파일러에서 해석한 후 출력해야 하며, 컴파일러에서의 해석으로 인해 쉽게 모호성이 발생할 수 있다는 점을 알아야 합니다.

예를 들어 "indexname"의 n은 줄 바꿈으로 해석됩니다. 이 외에도 사고를 일으키는 상황이 많이 있습니다.

因此一般我们推荐命名空间如果要放在字符串中使用,最好使用单引号,一是效率,二是安全,如果使用双引号,则必须增加一个\进行转义避免歧义,例如"index\\name"这样就没有问题了。

随手双引号的举个例子:

<?php 
/*全局非命名空间代码*/ 
namespace Index\Name{ 
  class foo{ 
    function __construct(){ 
      echo 2; 
    } 
  } 
} 
 
namespace{ 
  $a= "Index\\Name\\foo"; //用\转义了\所以可以正常运行,但是如果去掉转义的话会报错Class 'Index\Nameoo',因为/f被解释成了换页符 
  $obj=new $a; 
}

这部分碍于篇幅就暂时到这里了,下一篇主要总结命名空间里的namespace和__NAMESPACE__的使用,以及别名的使用等。

相关推荐:

php的命名空间解读

php命名空间用法详解

简单聊聊关于jquery的事件名称与命名空间

위 내용은 PHP 네임스페이스에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.