AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > PHP编程

PHP命名空间(Namespace)的使用详解

51自学网 2016-09-17 http://www.wanshiok.com

子空间
命名空间的调用语法像文件路径一样是有道理的,它允许我们自定义子空间来描述各个空间之间的关系。

抱歉我忘了说,article和message board这两个模块其实都是处于同一个blog项目内。如果用命名空间来表达它们的关系,是这样:

复制代码 代码如下:

<?php

//我用这样的命名空间表示处于blog下的article模块
namespace Blog/Article;

class Comment { }


//我用这样的命名空间表示处于blog下的message board模块
namespace Blog/MessageBoard;

class Comment { }

//调用当前空间的类
$comment = new Comment();

//调用Blog/Article空间的类
$article_comment = new /Blog/Article/Comment();

?>


而且,子空间还可以定义很多层次,比如说 Blog/Article/Archives/Date

 

公共空间
我有一个common_inc.php脚本文件,里面有一些好用的函数和类:

复制代码 代码如下:

<?php

function getIP() { }

class FilterXSS { }

?>


在一个命名空间里引入这个脚本,脚本里的元素不会归属到这个命名空间。如果这个脚本里没有定义其它命名空间,它的元素就始终处于公共空间中:
复制代码 代码如下:

<?php

namespace Blog/Article;

//引入脚本文件
include './common_inc.php';

$filter_XSS = new FilterXSS(); //出现致命错误:找不到Blog/Article/FilterXSS类

$filter_XSS = new /FilterXSS(); //正确

?>


调用公共空间的方式是直接在元素名称前加 / 就可以了,否则PHP解析器会认为我想调用当前空间下的元素。除了自定义的元素,还包括PHP自带的元素,都属于公共空间。

 

要提一下,其实公共空间的函数和常量不用加 / 也可以正常调用(不明白PHP为什么要这样做),但是为了正确区分元素,还是建议调用函数的时候加上 /


名称术语
在说别名和导入之前,需要知道关于空间三种名称的术语,以及PHP是怎样解析它们的。官方文档说得非常好,我就直接拿来套了。

1.非限定名称,或不包含前缀的类名称,例如 $comment = new Comment();。如果当前命名空间是Blog/Article,Comment将被解析为Blog/Article/Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。

2.限定名称,或包含前缀的名称,例如 $comment = new Article/Comment();。如果当前的命名空间是Blog,则Comment会被解析为Blog/Article/Comment。如果使用Comment的代码不包含在任何命名空间中的代码(全局空间中),则Comment会被解析为Comment。

3.完全限定名称,或包含了全局前缀操作符的名称,例如 $comment = new /Article/Comment();。在这种情况下,Comment总是被解析为代码中的文字名(literal name)Article/Comment。

其实可以把这三种名称类比为文件名(例如 comment.php)、相对路径名(例如 ./article/comment.php)、绝对路径名(例如 /blog/article/comment.php),这样可能会更容易理解。



说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
 
上一篇:PHP扩展库的详细清单概览  下一篇:php不启用save_mode安全模式的设置方法