namspace

什么是命名空间

命名空间概念的定义

命名空间是在 PHP 5.3 中引入的一个重要的工具,其作用是按照一种虚拟的层次结构来组织 PHP 代码,这种层次结构就像是我们在 Windows , Mac OS 等操作系统中的目录结构。全新的 PHP 框架和组件都放在各自全局的唯一厂商命名空间中,以免和其他厂商使用的类名发生冲突。

虽然说 PHP 命名空间和操作系统中的目录相似,但这只是一个虚拟概念,没必要和文件系统中的目录完全对应。尽管如此,绝大多数 PHP 组件为了兼容广泛使用的 PSR-4 自动加载标准(在后面的章节我会详细介绍),会把命名空间放在文件系统的子目录中。

why use namespace

为什么使用命名空间

命名空间存在的意义

命名空间很重要,因为有了它之后,在众多代码中,你可以和其他开发者编写的代码一起使用,这是现代 PHP 组件生态系统的基础。由于你在写代码时无法知道别人在使用自己的代码时,会同时引入其他别的什么类、接口或者常量。这样就会有很大几率导致自己和别人的命名重复(包括但不限于 类名、接口、函数等),产生致命错误。

如果你开发的是个人小型项目,使用了少量的依赖,类名,可能不会导致上面讲到的问题。但是如果你在团队中工作,开发过程中肯定会依赖许多大型的第三方项目,那么你就需要认真对待命名冲突的问题,因为你无法控制项目中依赖在全局命名空间中引入的类、接口、函数和常量。这就是为什么一定要使用命名空间。

define namespace

声明命名空间

介绍命名空间的用法

每个 PHP类、接口、函数和常量都在命名空间(或在子命名空间中)。命名空间在 PHP 文件的顶部, <?php 标签之后的第一行声明。命名空间声明语句以 namespace 开头,随后是一个空格,最后以 ; 结尾。

注意,命名空间经常用于设定顶层厂商名(也叫仓库名),下述实例中的命名空间设定的厂商名为 wowphp


<?php
namespace Wowphp;
		

在这个命名空间语句后声明的所有类 、接口、函数或常量都在 Wowphp 命名空间中,而且能够知道这个类和 WOWPHP 网站有着某种联系。如果我们想在 WOWPHP 命名空间中再组织一个新的类怎么办呢?答案是使用 子命名空间

子命名空间的声明方式和上面那个例子是一样的,唯一的区别是,我们要使用 \ 符号把命名空间和子命名空间分隔开。下面这个例子在最顶层的厂商命名空间 Wowphp 中声明了一个名为 Vagh 的子命名空间:


<?php
namespace Wowphp\Vagh;
		

在同一个命名空间或子命名空间中的所有类 没有必要 在同一个 PHP 文件中声明。因此,我们可以在不同的文件中编写属于同一个命名空间的多个类。

厂商命名空间(顶层命名空间)是最重要的命名空间,用于识别某个品牌或所属组织,必须具有全局唯一性(就像是 Github 中的项目路径)。子命名空间没有那么重要,但是有助于组织项目的代码。

why use namespace

导入命名空间

在命名空间出现之前, PHP 开发者使用 Zend 式类名解决命名冲突的问题,这是一种类的命名方案,因 Zend 框架而变得流行了起来。

例如: Wowphp_vagh_dont_want_work_in_company 这个类对应的文件是 Wowphp/vagh/dont/want/work/in/company.php 。可以看出,Zend 方式命名有个缺点:名字太长!像我这么懒的人,根本就不想输入这么长的类名!

现在,命名空间来了!我现在想使用上述 Class 文件中的方法,就可以使用命名空间的概念。比如我想使用其中一个叫做 resignation 的方法,就可以使用下面几种常见的引用方式:

使用命名空间,没有创建别名

<?php
$reply = new \Wowphp\vagh\dont\want\work\in\company();
$reply->resignation();
		

这还不算糟糕,如果我想创建多个 company 实例,我不出半年就可以换一个新的键盘了,不用担心,下面我将要介绍最常用的第二个方法。

使用命名空间和默认的别名

<?php
use Wowphp\vagh\dont\want\work\in\company;
$reply = new company();
$reply->resignation();
		

我们可以通过 use 关键字来告诉 PHP,我们想要使用 Wowphp\vagh\dont\want\work\in\company 类,只需要在顶部写上这个声明,那么我们就可以在后面的使用中直接使用 company 而不用写上完整的类名,是不是很棒!

如果你还是很懒,连 company 都不想多写,那你可以使用别名来命名这个命名空间。

使用命名空间,并定义别名

<?php
use Wowphp\vagh\dont\want\work\in\company as com;
$reply = new com();
$reply->resignation();
		

看懂了吗,这里我们使用了 as 关键字,这样就告诉了 PHP,我将要吧 company 命名为 com

小提示:使用 use 关键字时无需在开头加入 \ ,因为 PHP 假定导入的是完全限定的命名空间。

导入函数和常量(PHP5.6)

从 PHP5.6 开始,我们还可以导入函数和常量,不过要调整 use 关键字的语法。很简单,只需要在他后面加上一个 func :


<?php
use func Namespace\functionName;
functionName();
		

如果你想导入常量,那就这样写:


<?php
use constant Namespace\CONST_NAME;
echo CONST_NAME;
		

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~