dNFHTML5中文学习网 - HTML5先行者学习网
命名空间是PHP 5.3中最重要的变化,对于C#和Java开发人员对这个词语非常熟悉了,他们终于可以更好地改变PHP应用程序的结构了。dNFHTML5中文学习网 - HTML5先行者学习网
为什么我们需要命名空间?dNFHTML5中文学习网 - HTML5先行者学习网
随着你的PHP代码库的增长,对之前定义的函数和类名进行修改时风险也更高了,当你试图增加第三方组件或插件时问题更严重,如果存在两个或两个以上的代码集实现了一个“Database”和“User”类会怎么样?dNFHTML5中文学习网 - HTML5先行者学习网
直到目前,唯一的解决办法是使用长的类/函数名,例如Wordpress在每个类和函数名前都使用了前缀“WP_”, Zend Framework使用了极具描述性的命名约定,导致类名非常冗长,如:dNFHTML5中文学习网 - HTML5先行者学习网
Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitivedNFHTML5中文学习网 - HTML5先行者学习网
命名冲突问题可以使用命名空间来解决,PHP常量、类和函数可以被组合到命名空间库中。dNFHTML5中文学习网 - HTML5先行者学习网
如何定义命名空间?dNFHTML5中文学习网 - HTML5先行者学习网
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。dNFHTML5中文学习网 - HTML5先行者学习网
在PHP文件的顶部使用一个关键字namespace就可以定义命名空间,它必须是第一个命令(declare除外),在它前面不能出现非PHP代码、HTML或空格。如:dNFHTML5中文学习网 - HTML5先行者学习网
-
< ?php
- // define this code in the 'MyProject' namespace
- namespace MyProject;
-
- // ... code ...
这一行下面的代码都是指定给MyProject命名空间的,为相同代码块嵌套命名空间或定义多个命名空间是不可能的,如果你真这样干,只有最后一个命名空间才能识别,但你可以在同一个文件中定义不同的命名空间代码,如:dNFHTML5中文学习网 - HTML5先行者学习网
-
< ?php
- namespace MyProject1;
- // PHP code for the MyProject1 namespace
-
- namespace MyProject2;
- // PHP code for the MyProject2 namespace
-
- // Alternative syntax
- namespace MyProject3 {
- // PHP code for the MyProject3 namespace
- }
- ?>
尽管这么干是可以的,但我建议你不要这么做,最好还是每个文件中只定义一个命名空间,免得把你弄糊涂了。dNFHTML5中文学习网 - HTML5先行者学习网
子命名空间dNFHTML5中文学习网 - HTML5先行者学习网
PHP允许定义具有层次的命名空间以便库能够细分,子命名空间使用一个反斜线字符(/)分隔,如:dNFHTML5中文学习网 - HTML5先行者学习网
◆MyProject/SubNamedNFHTML5中文学习网 - HTML5先行者学习网
◆MyProject/Database/MySQLdNFHTML5中文学习网 - HTML5先行者学习网
◆CompanyName/MyProject/Library/Common/Widget1dNFHTML5中文学习网 - HTML5先行者学习网
调用命名空间代码dNFHTML5中文学习网 - HTML5先行者学习网
在lib1.php文件中我们使用App/Lib1 namespace命名空间定义了一个常量、一个函数和一个类,如:dNFHTML5中文学习网 - HTML5先行者学习网
lib1.phpdNFHTML5中文学习网 - HTML5先行者学习网
-
< ?php
- // application library 1
- namespace App/Lib1;
-
- const MYCONST = 'App/Lib1/MYCONST';
-
- function MyFunction() {
- return __FUNCTION__;
- }
-
- class MyClass {
- static function WhoAmI() {
- return __METHOD__;
- }
- }
- ?>
现在我们可以在另一个PHP文件包括这段代码,如:dNFHTML5中文学习网 - HTML5先行者学习网
myapp.phpdNFHTML5中文学习网 - HTML5先行者学习网
-
< ?php
- header('Content-type: text/plain');
- require_once('lib1.php');
-
- echo /App/Lib1/MYCONST . "/n";
- echo /App/Lib1/MyFunction() . "/n";
- echo /App/Lib1/MyClass::WhoAmI() . "/n";
- ?>
在myapp.php中并没有定义命名空间,因此这段代码存在全局空间中,任何对MYCONST、MyFunction和MyClass的直接引用都会失败,因为它们存在于App/Lib1命名空间中,为了调用lib1.php中的代码,我们可以在/App/Lib1命名空间前添加前缀定义一个完全合格的名称,下面是我载入myapp.php时的输出结果:dNFHTML5中文学习网 - HTML5先行者学习网
-
App/Lib1/MYCONST
- App/Lib1/MyFunction
- App/Lib1/MyClass::WhoAmI
完全合格名称可以变得很长,定义长名称,如App-Lib1-MyClass,有一些明显的好处。dNFHTML5中文学习网 - HTML5先行者学习网
dNFHTML5中文学习网 - HTML5先行者学习网dNFHTML5中文学习网 - HTML5先行者学习网