5.3 命名空间――《PHP高级程序设计:模式、框架和测试》
5.3 命名空间
命名空间对于PHP类来说就像是文件和目录的关系,它们给类库添加了结构和层次组织关系。命名空间允许你为两个不同的类使用相同的类名称。例如,你也许希望有一个名为Line的类,这个类会在图像上画一条线。然而,Line类的画线功能在处理像素格式图像和矢量格式图像时是大不一样的。理想的解决方案是使用两个带有命名空间的类,这样的话就可以给它们起相同的名称了。
命名空间使用了两个关键的语言结构:namespace和use。要声明一个命名空间,需要在文件的顶部指定命名空间的名称。在文件中声明的所有类和函数就属于这个命名空间了。namespace代码行必须在文件的顶部,在其他任何变量、类或者函数定义的前面。代码清单5-8演示了如何创建命名空间中的类。
代码清单5-8 声明命名空间(Vector.php)
namespace Vector;
class Line {
public function draw($x1, $y1, $x2, $y2) { . . . }
}
为了和命名空间一起使用,需重载作用域限定操作符(::)。例如,如果要在Vector命名空间中创建Line类的一个新实例,将使用作用域限定操作符,如代码清单5-9所示。
代码清单5-9 命名空间中的作用域限定
require_once('Vector.php');
$line = new Vector::Line();
$line->draw(1,1,10,10);
你可以使用多个层次的命名空间。例如,Graphics::Vector::Line就是一个有效的命名空间名称。唯一的限制就是在一个文件中只能声明一个命名空间。
随着命名空间越来越多,使用命名空间会显得有点烦琐。所幸,PHP还提供了use语句,允许给一个特定的命名空间起别名。代码清单5-10显示了如何使用use语句来缩短Line类的实例代码。
代码清单5-10 使用use语句
require_once('Vector.php');
use Vector::Line as Line;
$line = new Line();
$line->draw(1,1,10,10);
你还可以用use语句给整个命名空间起别名。






