## PHP命名空间 ###1. 什么是命名空间? > 从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。 例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。 具体举个例子,文件 foo.txt 可以同时在目录/home/one 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。 另外,在目录 /home/one 外访问 foo.txt 文件时, 我们必须将目录名以及目录分隔符放在文件名之前得到 /home/one/foo.txt。这个原理应用到程序设计领域就是命名空间 的概念。 ### 2. 命名空间解决的问题 > 1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突(解决名字冲突) > 2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。 ### 3. 如何使用命名空间及使用中要注意的事项 > 创建命名空间需要使用namespace关键词。 ~~~ <?php // 创建 namespace Blog; ?> ~~~ >[danger] 创建当前脚本第一个命名空间前面不能有任何代码,下面的写法都是错误的: ~~~ <?php $name = "test"; namespace Article; ?> ~~~ ~~~ <html></html> <?php namespace Article; ?> ~~~ >[info] 为什么强调说第一个命名空间呢?因为同一个脚本中可以创建多个命名空间。在不同的空间中,可以调用不同的元素。如: ~~~ <?php //创建一个名为'Article'的命名空间 namespace Article; //此Comment属于Article空间的元素 class Comment{} //创建一个名为MessageBoard的命名空间 namespace MessageBoard; //此Comment属于MessageBoard命名空间 class Comment{} ?> ~~~ >[info] 子命名空间,命名空间的调用语法像文件路径一样,这允许我们自定义子空间来描述各个空间之间的关系。如果上面Article和MessageBoard都同属于一个Blog项目内,那么我们用命名空间就得这样表示: ~~~ <?php //创建一个名为'Article'的命名空间 namespace Blog\Article; //此Comment属于Article空间的元素 class Comment{} //创建一个名为MessageBoard的命名空间 namespace Blog\MessageBoard; //此Comment属于MessageBoard命名空间 class Comment{} //调用当前空间的类,即Blog\MessageBorad下的Comment $comment = new Comment(); //调用Blog\Article空间的类 $article_comment = new \Blog\Article\Comment() ?> ~~~ >[info] 公共空间, 没有用namespace限制命名空间,则文件里的函数及类的命名空间则为公共空间。如我一个助手文件UtilityHelper.php文件: ~~~ <?php function dd(){} class CurlHelper{} ?> ~~~ >[info] 当公共空间文件引入非公共空间文件时,该脚本里的函数不会属于引入的命名空间,它始终处于公共空间内。 ~~~ <?php namespace Blog; require 'UtilityHelper.php'; //实例化例时,它仅会在指定或当前的命名空间下查找,如: $curl = new CurlHelper();//这个仅会查找当前命名空间,Blog\CurlHelper,结果出现了致命错误; $curl = new \CurlHelper();//会有公共空间查找,正确! ~~~ >[info] 调用公共空间的方式就是在直接元素的名称前面加\即可。 ### 4. 名称术语 >[info] 非限定名称,或不含前缀的类名称,其实就是目录路径中的相对路径。如: ~~~ <?php namespace Blog; class Comment{} //这就是非限定名称,它调用的是当前命名空间Blog下的Comment类 $comment = new Comment(); ?> ~~~ >[info] 限制名称,或包含前缀的名称。其实就是类名称的最左边没有反斜线。如: ~~~ <?php namespace Blog; class Comment{} //这就是限定名称,它调用的是当前命名空间Blog\Article下的Comment类 $comment = new Article\Comment(); ?> ~~~ >[info] 完全限定名称,或包含全局前缀的名称(反斜线)。其实就是类名的最左边加了反斜线。如: ~~~ <?php namespace Blog; class Comment{} //这就是完全限定名称,它调用的是当前命名空间Article下的Comment类 $comment = new \Article\Comment(); ?> ~~~ ### 5. 导入命名空间(use)及命名空间的别名(as) >[info] 使用use导入命名空间 ~~~ <?php namespace Blog; //导入命名空间 use abc; //如果导入的命名空间出现冲突时,用as别名,如 use Blog\abc as Babc; ?> ~~~ <embed src="http://www.tudou.com/v/9eT0KMlnZNc/&bid=05&rpid=1059277519&resourceId=1059277519_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="865" height="523"></embed> 百度下载地址:http://pan.baidu.com/s/1geTnrpD TP5粉丝群: 543608226 TP5底层答疑群: 451935051