PHP 命名空间

从PHP5.3.0开始引入命名空间的概念,那么命名空间是什么、为什么要使用命名空间、怎么使用命名空间呢?下面就给大家简单的讲解一下,相信读完这篇文章大家能对命名空间有比较清楚的认识。

一、命名空间是什么?

命名空间是现代PHP特性之一,从PHP5.3.0开始引入,其作用是将PHP代码按照一种虚拟的层次结构进行组织,这种结构类似于操作系统中文件系统的目录结构。下面看一个例子


第三行:namespace App\Model; 是PHP命名空间的声明语句,命名空间声明时要放在<?php 后的第一行。这样写之后 User 就被定位到命名空间 App\Model 中。

虽然命名空间类似于操作系统的物理文件系统,但有本质的不同。命名空间是一种虚拟的概念,没必要和文件系统中的目录结构完全相同。例如 User 在命名空间 App\Model 中, 但真实的文件目录却是 app\User.php 并没有 model 目录。 不过为了兼容PSR-4自动加载标准,一般都会把命名空间放到对应的文件系统的目录中。可以说命名空间的为现代PHP生态系统和基于组件的新型架构的实现奠定了坚实的基础。

二、为什么要使用命名空间

在通常的PHP开发中,除了使用自己的代码以外,往往会使用很多其他的PHP组件。这些组件代码可能会使用相同的类名、接口名、函数或者常量名等,如果不使用命名空间就会导致命名冲突,使PHP执行出错。而将代码放到各自唯一的命名空间中,我们的代码就可以和其他开发者使用相同的类名、接口名、函数或者常量名等,这在团队合作中相当重要。

在引入第三方组件依赖时,命名空间往往说明了开发此组件的厂商或组织。例如

在laravel框架中 TokenGuard 就位于厂商命名空间 Illuminate 中。

三、怎么使用命名空间

1、声明命名空间

声明命名空间:在<?php 后的第一行声明,声明语句以 namespace 开头,随后是一个空格,然后是命名空间的名称,最后以 ;结尾。

namespace Wilin;

通常命名空间的开头用于设置顶层厂商名,这个例子中设置厂商名为 Wilin 。在这个命名空间声明语句后声明的所有PHP类、接口、函数和常量等都在 Wilin 命名空间中。如果在该命名空间下想要组织代码,可以使用子命名空间,只要使用 \ 把命名空间和子命名空间分开就好了。例如:

namespace Wilin/Model;

这个命名空间中的类、接口、函数和常量等都在 Wilin\Model 命名空间中。

厂商命名空间是最顶层的命名空间,也是最重要的命名空间,用于识别品牌或组织,必须具有全局唯一性。子命名空间相对而言没那么重要,但是可以用于组织项目的代码。

2、全局命名空间

如果在当前的命名空间中引用的类、接口、函数和常量没有指定命名空间,PHP则会认为它处于全局命名空间中。在命名空间中引用全局的代码时需要在类、接口、函数或常量前加 \ 符号。例如原生的Exception类:

3、三种名称术语

  • 非限定名称,或不包含前缀的类名称:如果当前命名空间是 Wilin\Model ,对于 $user = new User(); 。User 将被解析为 Wilin\Model\User ,如果当前命名是全局命名空间,则会被解析为 User 
  • 限定名称,或包含前缀的名称:如果当前命名空间是 Wilin ,对于 $user = new Model\User(); 。User 将被解析为 Wilin\Model\User ,如果当前命名是全局命名空间,则会被解析为 Model\User
  • 完全限定名称,或包含了全局前缀操作符的名称:对于 $user = new \Wilin\Model\User(); 。在这种情况下,无论当前命名空间是什么 User 都将被解析为 Wilin\Model\User

下面给出具体例子:

4、导入&别名

上述 一、 中的 User 的全名是 App\Model\User ,如果我们想在其他地方使用这个类就要把全名写出来,而导入可以解决这个问题。

导入是指使用 use 关键字告诉PHP我们想使用哪个命名空间、类、接口、函数和常量,导入以后就不用再写全名了。例如:

如果这样类名还是长或者想给该类另起一个名字,可以使用 as 来创建别名。将上图中第12行和17行分别改成下面这样既可。

use App\Model\User as U;

$user = new U();

如果想要在PHP文件中导入多个类、接口、函数或常量,需要在PHP文件的顶部使用多个use语句,PHP支持用简短的语法把多个use语句写成一行。例如:

<?php
use App\Model\Admin;
use App\Model\User;

写成

<?php
use App\Model\Admin,App\Model\User;

不过这样可读性差,还是一行写一个use语句比较好。

posted @ 2019-01-16 10:49  魏亚林  阅读(2406)  评论(0编辑  收藏  举报