>  기사  >  백엔드 개발  >  PHP 명령 공간 네임스페이스 사용법 및 사용(예)

PHP 명령 공간 네임스페이스 사용법 및 사용(예)

墨辰丷
墨辰丷원래의
2018-05-17 10:02:272045검색

이 글은 주로 PHP 명령 공간 네임스페이스 사용법과 사용법에 대한 실제적인 요약을 소개합니다. 필요한 친구들이 참고할 수 있습니다.

네임스페이스의 가장 명확한 목적 중 하나는 두 가지 함수 또는 클래스 이름이 중복되는 문제를 해결하는 것입니다. PHP 이름이 동일할 수 없습니다. 그렇지 않으면 치명적인 오류가 발생합니다. 이런 경우에는 이름 중복만 피하면 해결이 됩니다. 가장 일반적인 방법은 접두사에 동의하는 것입니다.

네임스페이스 사용 목적:

팀 프로젝트를 진행할 때 다른 팀 구성원이 만든 새 클래스와의 충돌을 피하세요. 개인이 프로젝트를 담당할 때는 이전과 이후에 만든 새 클래스와의 충돌을 피하세요.

개인적인 이해에 따르면 필수 클래스를 require 또는 include로 먼저 도입해야 하므로 클래스 재정의 오류가 발생하기 위한 전제 조건은 동일한 이름의 두 클래스가 도입되어야 한다는 것입니다. 현재 일부 PHP 프레임워크는 새로 생성된 모든 모델 클래스를 자동으로 로드(즉, 포함)하므로 새 모델 클래스와 프로젝트 프레임워크의 기본 핵심 클래스 간의 이름 충돌을 피하기 위해 네임스페이스가 사용됩니다. (생각해 본 후, 팀원들이 새로 만든 클래스와의 충돌은 소통을 통해 피해야 한다. 사고가 발생한 후에도 클래스 이름을 즉시 재조정하고 유지 관리하여 나중에 클래스에 대한 이해의 혼란으로 인한 유지 관리 복잡성이 가중되는 것을 방지해야 한다. )

사용 방법을 결합하여 목적을 더 잘 이해했습니다.

네임스페이스 사용 방법:

테스트를 위해 1.php와 name.php라는 3개의 파일을 생성합니다(이 파일은 테스트를 수행하는 데 사용됩니다). 나중에 설명하지 않겠습니다. 코드 자체가 변경됩니다.

1. 네임스페이스 뒤의 이름 정의는 대소문자를 구분하지 않습니다.

네임스페이스 1; (다음 코드에서는 첫 번째 테스트 방법을 사용하겠습니다.)



2. 정의된 네임스페이스가 없으면 최상위 네임스페이스를 사용하는 것으로 이해됩니다. 새 클래스를 만들 때 클래스 앞에 백슬래시를 추가할지 여부를 지정할 수 있습니다.

//1.php 
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
require_once './1.php';
new Person(); //输出 I am one!;
new \Person(); //输出 I am one!;

3. 새 클래스를 추가할 때 네임스페이스를 가져올 때 슬래시 대신 백슬래시 문자를 사용해야 합니다.

메모리 방식: %에서 슬래시를 찾는 순서에 따라 슬래시로 해석합니다. (가끔 백슬래시라고 하면 어느 방향인지도 모르겠습니다. 예전에는 왼쪽에서 오른쪽으로 올라가는 방향으로 기억했는데 지금은 너무 믿음직스럽지 못한 것 같아요)

//name.php
require_once './1.php';
new /Person(); // 代码报错:Parse error: syntax error, unexpected '/'

4. 카테고리는 다음과 같습니다. 네임스페이스에 새 클래스를 지정할 때 지정된 네임스페이스가 포함되어야 합니다.

지정된 네임스페이스가 없습니다. 2번 항목에 따르면 PHP는 최상위 네임스페이스에서 이 클래스를 찾습니다. 기억하세요: 최상위 네임스페이스에는 다른 모든 네임스페이스가 포함되어 있으므로 이는 이해될 수 없습니다. 대신 최상위 네임스페이스는 다른 네임스페이스와 완전히 분리되어야 합니다.

//1.php 
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
require_once './1.php';
new \one\Person(); //输出 I am one!;
new \Person(); //代码报错:Fatal error: Class 'Person' not found

는 다음과 같은 유명한 예를 통해 이해할 수 있습니다. 지정된 네임스페이스를 사용하는 것은 누군가의 사과(그 사람 손에 있음)를 나타내고 최상위 네임스페이스는 사과 상자(상자 안)에 있는 사과를 나타냅니다. 이제 누군가의 사과를 찾으려면 누군가의 네임스페이스를 가져와야 합니다. 그렇지 않으면 상자에서 누군가의 사과를 찾게 되며 당연히 찾을 수 없습니다.

5. 네임스페이스 선언 뒤의 코드는 이 네임스페이스에 속하므로 include나 require가 있어도 영향을 받지 않습니다. (문장의 후반부에 대한 이해가 중요합니다. 자세한 내용은 코드를 참조하세요.) .

//1.php 
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
namespace test;
require './1.php'; 
new \one\Person(); //输出 I am one!;
new Person(); //这里结果会是什么呢,猜猜看

마지막 줄에서는 오류가 발생합니다.

Fatal error: Class 'test\Person' not found

우선 이것을 포인트 2와 비교해 보세요.

포인트 2, 네임스페이스가 없을 때, 네임스페이스가 있을 때 새로운 클래스, 새로운 클래스가 있나요? 백슬래시는 같은 의미를 갖습니다.

여기서 네임스페이스에는 백슬래시가 있는 것과 없는 것이 의미가 다릅니다.

마지막 줄을

new \Person();

로 바꾸세요. 결과는 오류입니다.

Fatal error: Class 'Person' not found

그럼 현재 지점에 대해 이야기해 보겠습니다.

코드의 마지막 줄에 해당하는 네임스페이스는 test이며, require 파일의 네임스페이스에 영향을 받지 않는 것을 확인할 수 있습니다.

검증을 더욱 강화하기 위해 name.php 파일을 다음과 같이 수정했습니다.

//name.php
namespace test;
require './1.php'; 
class Person{
 function __construct(){
  echo 'I am test!';
 }
}
new \one\Person(); //输出 I am one!;
new Person(); //这里结果会是什么,自己猜猜看

마지막으로 이 예를 통해 require에 대한 이해가 새로워졌습니다.

require에 대한 이전 이해에 따르면, PHP 프로그램이 실행되기 전에 먼저 require에 지정된 파일을 읽어 PHP 프로그램 웹 페이지의 일부로 만듭니다. 그래서 저는 단순히 추출된 코드를 원래 위치에 다시 놓는 대체품으로 이해하는 경우가 많습니다. 그런 다음 1.php 파일의 내용을 name.php에 넣으려고 했습니다.

//name.php
namespace test;
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
class Person{
 function __construct(){
  echo 'I am test!';
 }
}

새 클래스가 없으면 파일에서 오류를 보고합니다.

Fatal error: Cannot redeclare class onePerson

것 같습니다. 단순 요구는 교체로 이해되며 여기서는 작동하지 않습니다.

6. 네임스페이스에는 클래스 이름이 포함되어 있지 않습니다. 클래스 이름과 동일한 이름의 부분이 있어도 클래스를 나타내지 않습니다. 새 수업인데 이 부분은 계속 가져와야 해요.

//name.php
namespace test\person;
class Person{
 function __construct(){
  echo 'I am test!';
 }
}new \test\person\Person();  //命名空间里person无法代表类名

하지만 이것은 순전히 불필요한 것이므로 네임스페이스에 클래스 이름을 포함하지 마세요.

7. PHP 파일에는 여러 개의 네임스페이스가 존재할 수 있으며 첫 번째 네임스페이스 앞에는 코드가 있을 수 없습니다.

只说第一个命名空间前不能有任何代码,之后的命名空间之前可以有代码。这个自行测试即可。

//name.php
namespace test;
echo 'zhai14';
namespace zhai;
require './1.php';

php命名空间namespace告一段落了,接下来说说use的用途。

使用use的目的:

在命名空间字符串过长时,使用use可以相应的缩短命名空间。

use的使用方法:

1.new类时,最前面无需用反斜杠。此外,use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
namespace animal\cat;
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
new Life(); //按照代码执行顺序,这里默认animal\cat这个命名空间
new \animal\dog\Life(); //A
use animal\dog; //a
new dog\Life(); //B
use animal\dog as d; //b
new d\Life();

 通过A、B行代码比较,需要注意:

使用use后,new类时,最前面没有反斜杠。

没使用use时,命名空间最前面有反斜杠

通过a、b行代码比较,可以理解:

use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。如上的:

use animal\dog;

相当于

use animal\dog as dog; 

2.namespace后面不建议加类名,但use后可以。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
namespace animal\cat;
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
use animal\dog\Life as dog; 
new dog();

如上所示,use后加上类名后,就相当于把类改了个名称:由Life改为dog了。

上面不用as dog就会报错:

Fatal error:  Cannot use animal\dog\Life as Life because the name is already in use
因为cat下也有个一样名称的Life类。

可以理解为,使用use后,这个昵称对应的类只能归当前命名空间占有,其它命名空间下不允许存在该类。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
class Dog{
 function __construct(){
  echo 'dog in dog!';
 }
}
namespace animal\cat;
// class Dog{
// function __construct(){
//  echo 'dog in cat!';
//  }
// }
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
use animal\dog; 
new dog\Dog();

如上,使用了

use animal\dog;
cat

通过上面代码,我想使用use的目的效果(缩短命名空间名称)就很明显了。

简单总结一下:

namespace就是划分领域的作用,代表这些东西是属于某个命名空间下的。

use就是起小名的作用,不论写起来还是说起来都可以省不少事儿。

相关推荐:

PHP命令空间的用法大全

php user_error()函数的简介

有关php user_error()函数的文章推荐10篇

위 내용은 PHP 명령 공간 네임스페이스 사용법 및 사용(예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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