우리는 네임스페이스의 가장 명확한 목적 중 하나가 중복 이름 문제를 해결하는 것임을 알고 있으므로 PHP에서는 두 함수나 클래스가 동일한 이름을 가질 수 없습니다. 그렇지 않으면 치명적인 오류가 발생합니다. 이런 경우에는 이름 중복만 피하면 해결이 됩니다. 가장 일반적인 방법은 접두사에 동의하는 것입니다.
네임스페이스 사용 목적:
팀 프로젝트 작업 시, 개인이 프로젝트를 담당하는 경우 다른 팀 구성원이 만든 새 클래스와의 충돌을 피하고, 이전과 이후에 만든 새 클래스와의 충돌을 피하세요. 개인적인 이해에 따르면 모두 사용되는 클래스가 필요할 때 먼저 require나 include로 도입해야 하므로 클래스 재정의 오류가 발생하기 위한 전제 조건은 같은 이름의 두 클래스가 도입되어야 한다는 것이다. 현재 일부 PHP 프레임워크는 새로 생성된 모든 모델 클래스를 자동으로 로드(즉, 포함)합니다. 따라서 새로 생성된 모델 클래스와 프로젝트 프레임워크의 기본 핵심 클래스 간의 이름 충돌을 피하기 위해 네임스페이스가 사용됩니다. (생각해 본 후, 팀원들이 새로 만든 클래스와의 충돌은 소통을 통해 피해야 한다. 사고가 발생한 후에도 클래스 이름을 즉시 재조정하고 유지 관리하여 나중에 클래스에 대한 이해의 혼란으로 인한 유지 관리 복잡성이 가중되는 것을 방지해야 한다. )
사용 방법을 결합하여 목적을 더 잘 이해했습니다. 네임스페이스 사용 방법:
테스트를 위해 1.php와 name.php(테스트에 사용되는 파일) 3개의 파일을 생성합니다. 이는 나중에 설명하지 않으니 코드 변경에 주의하시기 바랍니다.
1. 네임스페이스 뒤의 명명 정의는 대소문자를 구분하지 않습니다.
namespace one;
namespace One;namespace ONE;
위 방법으로 작성하면 되며 원하는 사양으로 하나만 선택하면 됩니다. (다음 코드에서는 첫 번째 테스트 방법을 사용하겠습니다.)
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!'; } }
No new class is needed, 파일에서 오류를 보고합니다.
Fatal error: Cannot redeclare class onePerson
require는 다음과 같습니다. 단순히 replacement 로 이해되며 여기서는 작동하지 않습니다.
6. 네임스페이스에는 클래스 이름이 포함되어 있지 않습니다. 클래스 이름과 동일한 이름의 부분이 있어도 클래스를 나타내지 않습니다. 새 수업인데 이 부분은 계속 가져와야 해요.
//name.php namespace test\person; class Person{ function construct(){ echo 'I am test!'; }
}new testpersonPerson(); //Person은 네임스페이스에서 클래스 이름을 나타낼 수 없습니다
그러나 이는 완전히 불필요하므로 네임스페이스에 클래스 이름을 포함하지 마세요.
7. PHP 파일에는 여러 개의 네임스페이스가 존재할 수 있으며 첫 번째 네임스페이스 앞에는 코드가 있을 수 없습니다.
첫 번째 네임스페이스 앞에는 코드가 있을 수 없으며 후속 네임스페이스 앞에는 코드가 있을 수 있다는 것만 나와 있습니다. 직접 테스트해 볼 수 있습니다.
//name.php namespace test; echo 'zhai14'; namespace zhai; require './1.php';
php 네임스페이스
네임스페이스가 끝났습니다. 사용에 대해 이야기해 보겠습니다.
使用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就是划分领域的作用,代表这些东西是属于某个命名空间下的。
相信看了这些案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
相关阅读:
위 내용은 PHP 명령 공간의 완전한 활용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!