搜索

2011年2月6日星期日

Namespace 与 Include / Require (PHP 5.3)

本文英文版

PHP 5.3 引入了一个新特性:Namespace,却为 include / require 指令带来不小困扰。

以前,我们通常这样使用 include / require 指令:
  1. 设置恰当的 include_path
  2. 一个 class 一个文件,文件名通常为: classname.php
  3. require_once 'classname.php' (简单的使用相对路径)
  4. 还可以使用 __autoload function 来自动加载(也使用相对路径)
这样整个系统可以不依赖特定的路径工作。

但是 namespace 破坏了这个规则。

在 namespace 体系下,老办法会出问题:
  1. \namespace1\class
  2. \namespace2\class
指令 require_once 'class.php' 不会正常工作。

现在,__autoload function 中,class name / interface name 以这样的格式传递:namespace\classname ( interface name ),如果依然按照老习惯,把所有包含文件放到一个文件夹,那么可能会产生命名冲突(不同 namespace 下的同名 class)。

所以,需要引入新方法:
  1. 按照 namespace 分别放置包含文件,每个 namespace 单独一个文件夹,文件树类似:
    • include
      • namespace1
        • sub-namespaceA
      • namespace2
      • ……
  2. 如果手动设置 include / require 则使用绝对路径。因为相对路径依赖 include_path 中的顺序,可能错误的引用不同 namespace 下的同名 class。魔术常量 __DIR__ 和 __FILE__ 会有助于构造路径。
  3. 在 __autoload function 中,根据 namespace 分别构造路径,同样 __DIR__ 和 __FILE__ 会有帮助。
附:
我认为新的 namespace 特性给 include / require / __autoload 带来了额外的复杂性,希望 PHP 的开发者能够简化它。

没有评论:

发表评论