PHP namespace命名空间的用法(附带实例)
PHP 代码的物理存放形式是以 .php 为扩展名的文本文件,而命名空间则是开发资源的一种逻辑组织形式,可以有效区分不同开发者提供的资源。
例如,A 资源中定义了 tC1 类,B 资源中也定义了 tC1 类,在一个代码文件中同时使用 A 资源和 B 资源时,就需要区分不同的 tC1 类,此时,就可以使用命名空间分别组织 A 资源和 B 资源。
接下来创建 /demo/A.php 文件并修改内容如下:
创建 /demo/B.php 文件并修改内容如下:
A.php 和 B.php 文件中的第一行代码使用 namespace 关键字分别定义了资源所属的命名空间。下面的代码演示了如何在一个文件中使用这两个命名空间中的 tC1 类。
定义命名空间时,还可以使用多级管理。如下面的代码,在 /demo/C.php 文件中定义了一个多级命名空间,其中定义了 tC1 类。
使用 use 语句指定命名空间和类的完整路径后,代码中可以直接使用类名,如前面的示例。如果没有使用 use 语句引用类,就需要使用类的完整路径,如下面的代码:
实际开发中,如果每个资源文件都需要单独引用,其效率是非常低的。不过,PHP 提供了自动引用代码文件的机制。
例如,A 资源中定义了 tC1 类,B 资源中也定义了 tC1 类,在一个代码文件中同时使用 A 资源和 B 资源时,就需要区分不同的 tC1 类,此时,就可以使用命名空间分别组织 A 资源和 B 资源。
接下来创建 /demo/A.php 文件并修改内容如下:
<?php namespace A; class tC1 { public function m1() { echo __NAMESPACE__,"<br>"; echo __METHOD__,"<br>"; } } ?>
创建 /demo/B.php 文件并修改内容如下:
<?php namespace B; class tC1 { public function m1() { echo __NAMESPACE__,"<br>"; echo __METHOD__,"<br>"; } } ?>
A.php 和 B.php 文件中的第一行代码使用 namespace 关键字分别定义了资源所属的命名空间。下面的代码演示了如何在一个文件中使用这两个命名空间中的 tC1 类。
<?php require_once $_SERVER["DOCUMENT_ROOT"]."/demo/A.php"; require_once $_SERVER["DOCUMENT_ROOT"]."/demo/B.php"; use A\tC1 as tC1A; use B\tC1 as tC1B; $objA = new tC1A(); $objA->m1(); echo "<br>"; $objB = new tC1B(); $objB->m1(); ?>代码中,首先使用 require_once 语句引用了 A.php 和 B.php 文件。然后,使用 use 语句引用 A 命名空间中的 tC1 类,并使用 as 关键字定义别名为 tC1A,引用 B 命名空间中的 tC1 类并定义别名为 tC1B。最后,分别创建 tC1A 和 tC1B 类的对象,并调用 m1() 方法,代码执行结果见下图。

定义命名空间时,还可以使用多级管理。如下面的代码,在 /demo/C.php 文件中定义了一个多级命名空间,其中定义了 tC1 类。
<?php namespace A\B\C; class tC1 { public function m1() { echo __NAMESPACE__,"<br>"; echo __METHOD__,"<br>"; } } ?>使用多级命名空间下的类时,需要指定完整的命名空间路径,如下面的代码:
use A\B\C\tC1;代码执行结果见下图。

使用 use 语句指定命名空间和类的完整路径后,代码中可以直接使用类名,如前面的示例。如果没有使用 use 语句引用类,就需要使用类的完整路径,如下面的代码:
<?php require_once $_SERVER["DOCUMENT_ROOT"]."/demo/C.php"; $c1 = new A\B\C\tC1(); $c1->m1(); ?>命名空间的层次表示了引用资源的路径,主要有两种形式:
-
第一种形式,当路径的第一个字符是
\
时,表示从网站全局环境引用命名空间,如 PHP 中的扩展模块,在封装的类中需要引用这些资源时,就可能需要指定完整的路径,如代码“$db=new \mysqli();”创建了一个 mysqli 对象。 -
第二种形式,当路径不以
\
符号开始时,指定了资源引用的相对路径,会从当前位置开始查找所需资源。
实际开发中,如果每个资源文件都需要单独引用,其效率是非常低的。不过,PHP 提供了自动引用代码文件的机制。