면책 조항: 이 기사는 현대 PHP를 기반으로 하며 모든 사람이 기본 소스 코드를 더 쉽게 연구할 수 있도록 Laravel 소스 코드를 예로 사용합니다.
1. 네임스페이스란 무엇인가요?
최신 PHP 기능 중 하나만 알아야 한다면 네임스페이스여야 합니다. 네임스페이스는 PHP5.3.0에서 도입되었으며, 그 기능은 가상 계층 구조에 따라 PHP 코드를 구성하는 것입니다. 이 계층 구조는 운영 체제의 파일 시스템 디렉토리 구조와 유사합니다.
[관련 권장사항:PHP 튜토리얼]
네임스페이스는 최신 PHP 구성 요소 생태학의 기초입니다. 최신 PHP 구성 요소 프레임워크 코드는 다른 제조업체와의 공통 사용을 피하기 위해 전역적으로 고유한 제조업체 네임스페이스에 배치됩니다.
실제 PHP 구성요소가 네임스페이스를 어떻게 사용하는지 살펴보겠습니다. Laravel 프레임워크의 Http 구성 요소는 HTTP 요청 및 응답을 관리하는 데 사용됩니다. 이 구성 요소는 요청 및 응답과 같은 일반적인 클래스 이름을 사용합니다. 다른 PHP 코드도 동일한 클래스 이름을 사용합니다. 이 구성 요소를 사용하는 방법은 무엇입니까?
사실 이 컴포넌트의 코드는 제조사의 유일한 네임스페이스인Illuminate
에 배치되어 있기 때문에 안심하고 사용할 수 있습니다.Illuminate
中。
打开这个组件在GitHub中的仓库(https://github.com/laravel/framework/blob/master/src/Illuminate/Http/Response.php),找到Response.php
文件:
第3行代码如下:
namespace Illuminate\Http;
这一行是PHP命名空间声明语句,声明命名空间的代码始终应该放在标签后的第一行。通过这个命名空间的声明语句我们可以看到
Response
位于厂商命名空间Illuminate
中(最顶层命名空间),我们还看到Response
类在子命名空间Http
中,你可以看下和Response.php
文件在同一层级的其他文件,会发现它们都使用相同的命名空间声明语句。
命名空间的作用是封装和组织相关的PHP类,就像在文件系统中把相关的文件放在同一个目录中一样。PHP命名空间和操作系统的物理文件系统不同,这是一个虚拟概念,没必要和文件系统中的目录结构完全相同,虽然如此,但是大多数PHP组件为了兼容广泛使用的PSR-4自动加载标准,会把命名空间放到对应文件系统的子目录中。
2、为什么使用命名空间
前面已经提到过,我们的代码可能和其他开发者的代码使用相同的类名、接口名、函数或常量名,如果不使用命名空间,名称会起冲突,导致PHP执行出错。而使用命名空间将代码放到唯一的厂商命名空间,我们的代码就可以和其他开发者使用相同的类名、接口名、函数或常量名。
当然如果你开发的是小型个人项目,只有少量的依赖,类名冲突可能不是问题,但是如果在团队中工作,开发用到许多第三方依赖的大型项目,就要认真对待命名冲突问题,因为你无法控制项目依赖在全局命名空间中引入的类、接口、函数和常量,这也是为什么要使用命名空间的原因。
3、声明命名空间
每个PHP类、接口、函数和常量都在命名空间中,声明命名空间很简单,在标签后的第一行声明,声明语句以
namespace
开头,随后是一个空格,然后是命名空间的名称,最后以;
结尾。
命名空间经常用于设置顶层厂商名,比如我们设置厂商名为LaravelAcademy
:
로그인 후 복사
在这个命名空间声明语句后声明的所有PHP类、接口、函数和常量都在LaravelAcademy
命名空间中,而且和Laravel学院有某种关系。如果我们想组织学院用到的代码该怎么做呢?答案是使用子命名空间。
子命名空间的声明方式和前面的示例完全一样,唯一的区别是我们要使用符号把命名空间和子命名空间分开,例如:
로그인 후 복사
这个命名空间后的所有类、接口、函数和常量都位于LaravelAcademyModernPHP
Response.php
를 찾으세요. 파일 :
세 번째 코드 줄은 다음과 같습니다.
send();
태그 뒤 첫 번째 줄에 배치되어야 합니다. 이 네임스페이스의 선언문을 통해
Response
가 제조업체 네임스페이스
Illuminate
(최상위 네임스페이스)에 위치함을 알 수 있습니다.클래스는 하위 네임스페이스
Http
에 있습니다.
Response.php
파일과 동일한 수준의 다른 파일을 보면 해당 파일이 있다는 것을 알 수 있습니다. 모두 동일한 네임스페이스 선언문을 사용합니다. 네임스페이스의 역할은 관련 파일을 파일 시스템의 동일한 디렉터리에 두는 것과 마찬가지로 관련 PHP 클래스를 캡슐화하고 구성하는 것입니다. PHP 네임스페이스는 운영 체제의 실제 파일 시스템과 다릅니다. 가상 개념이므로 파일 시스템의 디렉터리 구조와 반드시 동일할 필요는 없습니다. 그러나 대부분의 PHP 구성 요소는 널리 사용되는 구성 요소와 호환됩니다. PSR-4 자동 로딩 표준. 네임스페이스는 해당 파일 시스템의 하위 디렉터리에 배치됩니다. 2. 네임스페이스를 사용하는 이유앞서 언급했듯이 우리 코드에서는 다른 개발자의 코드와 동일한 클래스 이름, 인터페이스 이름, 함수 또는 상수 이름을 사용할 수 있습니다. , PHP 실행 오류가 발생합니다. 네임스페이스를 사용하여 고유한 제조업체 네임스페이스에 코드를 배치함으로써 우리 코드는 다른 개발자와 동일한 클래스 이름, 인터페이스 이름, 함수 또는 상수 이름을 사용할 수 있습니다. 물론 소수의 종속성만 있는 소규모 개인 프로젝트를 개발하는 경우 클래스 이름 충돌은 문제가 되지 않을 수 있지만 팀으로 작업하고 많은 타사 종속성을 사용하는 대규모 프로젝트를 개발하는 경우에는 다음을 수행해야 합니다. 이름 지정 충돌이 심각합니다. 프로젝트가 의존하는 클래스, 인터페이스, 함수 및 상수를 전역 네임스페이스에 도입하여 제어할 수 없기 때문에 네임스페이스가 사용됩니다. 3. 네임스페이스 선언모든 PHP 클래스, 인터페이스, 함수 및 상수는 네임스페이스에 있습니다.
태그 다음은 매우 간단합니다. 선언 줄은
네임스페이스
로 시작하고 공백, 네임스페이스 이름 순으로 나오고
;
로 끝납니다. 네임스페이스는 종종 최상위 공급업체 이름을 설정하는 데 사용됩니다. 예를 들어 공급업체 이름을
LaravelAcademy
로 설정합니다.
send();
로그인 후 복사
로그인 후 복사
이 네임스페이스 선언 이후에 선언된 모든 PHP 클래스, 인터페이스, 함수 및 상수 문은
LaravelAcademy
네임스페이스에 있으며 Laravel Academy와 어떤 관계가 있습니다. 학원에서 사용하는 코드를 정리하고 싶다면? 대답은 하위 네임스페이스를 사용하는 것입니다. 하위 네임스페이스 선언 방법은 이전 예와 완전히 동일합니다. 유일한 차이점은
기호를 사용하여 네임스페이스와 하위 네임스페이스를 구분해야 한다는 것입니다. 예:
로그인 후 복사
로그인 후 복사
이 네임스페이스 이후의 모든 클래스, 인터페이스, 함수 및 상수는
LaravelAcademyModernPHP
에 있습니다. 동일한 네임스페이스의 클래스는 동일한 PHP 파일에서 선언할 필요가 없습니다. PHP 파일 상단에 네임스페이스 또는 하위 네임스페이스를 지정할 수 있습니다. 이때 이 파일의 코드는 네임스페이스 또는 하위의 일부입니다. -네임스페이스. 따라서 서로 다른 파일에 동일한 네임스페이스에 속하는 여러 클래스를 작성할 수 있습니다.
注:厂商命名空间是最顶层的命名空间,也是最重要的命名空间,用于识别品牌或组织,必须具有全局唯一性。子命名空间相对而言没那么重要,但是可以用于组织项目的代码。
4、导入和别名
在命名空间出现之前,PHP开发者使用Zend风格的类名解决命名冲突问题,这是一种类的命名方案,因Zend框架而流行,这种命名方案在PHP类名中使用下划线的方式表示文件系统的目录分隔符。这种约定有两个作用:其一,确保类名是唯一的;其二,原生的自动加载器会把类名中的下划线替换成文件系统的目录分隔符,从而确定文件的路径。例如,Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query
类对应的文件是Zend/Cloud/DocumentService/Adapter/WindowsAzure/Query.php
。可以看出,这种命名有个缺点:类名特别长。
现代的PHP命名空间也有这个问题,例如上述Response
类完整的全名是Illuminate\Http\Response
,幸好,我们可以通过导入以及创建别名的方式来改变这一状况。
导入的意思是指,在每个PHP文件中告诉PHP想使用哪个命名空间、类、接口、函数和常量,导入后就不用使用全名了:
send();
로그인 후 복사
로그인 후 복사
我们通过use
关键字告诉PHP,我们想使用Illuminate\Http\Response
类,我们只需要输入一次完全限定的类名,随后实例化Response
的时候,无需使用完整的类名。
如果觉得这样的类名还是长,可以创建别名。创建别名指的是告诉PHP我要使用简单的名称引用导入的类、接口、函数或常量:
send();
로그인 후 복사
로그인 후 복사
从PHP 5.6开始还可以导入函数和常量,不过要调整use关键字的句法,如果要导入函数,需要使用use func
:
로그인 후 복사
로그인 후 복사
如果想导入常量,可以使用use constant
:
로그인 후 복사
当然也支持别名,创建方式和类一样。
5、实用技巧
多重导入
如果想要在PHP文件中导入多个类、接口、函数或常量,需要在PHP文件的顶部使用多个use语句,PHP支持用简短的语法把多个use语句写成一行:
로그인 후 복사
但是为了可读性,建议不要这么写,还是一行写一个use语句比较好:
로그인 후 복사
一个文件使用多个命名空间
PHP允许在一个文件中定义多个命名空间:
로그인 후 복사
但这么做不好,违背了“一个文件一个类”的良好实践,因此不建议这么做。
全局命名空间
如果引用的类、接口、函数和常量没有指定命名空间,PHP假定引用的类、接口、函数和常量在当前的命名空间中。如果要使用其他命名空间的类、接口、函数或常量,需要使用完全限定的PHP类名(命名空间+类名)。
有些代码在全局命名空间中,没有命名空间,比如原生的Exception类就是这样。在命名空间中引用全局的代码时,需要在类、接口、函数或常量前加\
符号:
로그인 후 복사
自动加载
命名空间还为PHP-FIG制定的PSR-4自动加载标准奠定了坚实的基础,大多数现代的PHP组件都使用了这种自动加载模式,使用依赖管理器Composer可以自动加载项目的依赖,后续我们还会详细介绍Composer和PHP-FIG,现在你只需要知道没有命名空间,就没有现代的PHP生态系统和基于组件的新型架构,由此可见命名空间的重要性。
相关学习推荐:PHP编程从入门到精通
위 내용은 PHP의 네임스페이스란 무엇입니까? 네임스페이스를 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!