## 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