1.介绍一下php的命名空间
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/Home/greg 和 /Home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /Home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /Home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
2.php那个版本以上支持命名空间?
PHP 在 5.3.0 以后的版本开始支持命名空间
3.测试示例
a.测试一
测试文件的目录结构及路径如下:
E:\myphp\research\namespace\market\fruit\inc.php
E:\myphp\research\namespace\market\fruit\inc_test1.php
E:\myphp\research\namespace\market\fruit\inc_test2.php
E:\myphp\research\namespace\market\fruit\inc_test3.php
E:\myphp\research\namespace\market\fruit\inc_test4.php
E:\myphp\research\namespace\market\fruit\inc_test5.php
E:\myphp\research\namespace\market\fruit\inc_test6.php
inc.php
1 <?php 2 /* 3 * @date 2016-4-8 4 * @author caihuafeng 5 */ 6 namespace market\fruit; 7 class Apple { 8 public function __construct($file = __FILE__) { 9 echo sprintf("Inner |%s|, invoked by file:|%s|\n", __METHOD__, $file); 10 } 11 } 12 ?>
inc_test1.php
1 <?php 2 /* 3 * @date 2016-4-8 4 * @author caihuafeng 5 */ 6 include_once(‘inc.php‘); 7 8 //实例化类Apple时直接在前面加上命名空间 9 $apple = new \market\fruit\Apple(__FILE__); 10 11 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test1.php| 12 13 //用new market\fruit\Apple(__FILE__); 或 new \market\fruit\Apple(__FILE__);均输出同样的结果,即market前面有没有\结果都一样 14 ?>
inc_test2.php
1 <?php 2 /* 3 * @date 2016-4-8 4 * @author caihuafeng 5 */ 6 namespace market\fruit; //调整当前脚本到market\fruit这个命名空间,而且namespace申明必须在第一句 7 include_once(‘inc.php‘); 8 9 //由于上面第一行声明了类Apple的命名空间market\fruit,因此下面实例化类Apple的时候,就不需要在Apple前面加上命名空间market了 10 $apple = new Apple(__FILE__); 11 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test2.php| 12 ?>
inc_test3.php
1 <?php 2 /* 3 * @date 2016-4-8 4 * @author caihuafeng 5 */ 6 include_once(‘inc.php‘); 7 8 //定义别名, market\fruit\Apple最后面Apple是类名,定义market\fruit\Apple的别名为mfa 9 use market\fruit\Apple as mfa; 10 11 //由于上面声明了定义market\fruit\Apple的别名为ma,因此下面可以直接用mfa代替market\fruit\Apple 12 $apple = new mfa(__FILE__); 13 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test3.php| 14 ?>
inc_test4.php
1 <?php 2 /* 3 * @date 2016-4-8 4 * @author caihuafeng 5 */ 6 include_once(‘inc.php‘); 7 8 //定义别名, market\fruit是命名空间,定义market\fruit的别名为mf 9 use market\fruit as mf; 10 //Warning: The use statement with non-compound name ‘market‘ has no effect in E:\myphp\research\namespace\market\inc_test4.php on line 5 11 12 //由于上面声明了定义market\Apple的别名为ma,因此下面可以直接用ma代替market\Apple 13 $apple = new mf\Apple(__FILE__); 14 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test4.php| 15 16 /* 17 如果将上述$apple = new mf\Apple(__FILE__);修改为$apple = new \mf\Apple(__FILE__);[区别是在mf前面加上了\,如果定义了别名,则在别名前面不需要加上\],将会报如下的错误: 18 Fatal error: Class ‘mf\Apple‘ not found in E:\myphp\research\namespace\market\inc_test4.php on line 9 19 */ 20 ?>
inc_test5.php
1 <?php 2 /* 3 * @date 2016-4-8 4 * @author caihuafeng 5 */ 6 include_once(‘inc.php‘); 7 8 //如果省略后面的as ....,那么,就可以直接用最后一节的文字来fruit代替 9 use market\fruit; 10 11 //由于上面声明了use market\fruit,下面的实例化用fruit代替market\fruit 12 $apple = new fruit\Apple(__FILE__); 13 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test5.php| 14 ?>
inc_test6.php
1 <?php 2 /* 3 * @date 2016-4-8 4 * @author caihuafeng 5 */ 6 include_once(‘inc.php‘); 7 8 //如果省略后面的as ....,那么,就可以直接用最后一节的文字来Apple代替 9 use market\fruit\Apple; 10 11 //由于上面声明了use market\fruit,下面的实例化用fruit代替market\fruit 12 $apple = new Apple(__FILE__); 13 //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test6.php| 14 ?>
b.测试二
E:\myphp\research\namespace\demo.php
1 <?php 2 /* 3 * @date 2016-4-8 4 * @author caihuafeng 5 * 命名空间下直接new该命名空间中的class名称,可以省略掉use语法,这是php按脚本书写顺序执行导致的。例如如下代码是可以运行的 6 */ 7 namespace DemoTest; 8 class Demo { 9 public function __construct() { 10 echo "this is a test script\n"; 11 } 12 } 13 14 namespace DemoNameSpace; 15 class Demo { 16 public function __construct() { 17 echo ‘This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is ‘.__NAMESPACE__ . "\n"; 18 } 19 } 20 /* 21 同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class 22 下面一行相当于$Demo = new \DemoNameSpace\Demo(); 23 */ 24 $Demo = new Demo(); 25 26 //调用DemoTest空间的Demo类 27 use DemoTest\Demo as d; 28 $d = new d(); 29 30 /* 31 输出 32 This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is DemoNameSpace 33 this is a test script 34 */ 35 36 /* 37 这个结果表明,同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class 38 */ 39 ?>
延伸阅读:
PHP 在 5.3.0 以后的版本开始支持命名空间。
http://zhidao.baidu.com/question/401496650
php use php namespace 到底是怎么一回事
http://zhidao.baidu.com/question/506941048
php namespace use include
http://www.baidu.com/s?wd=php%20namespace%20use%20include
PHP中的命名空间(namespace)及其使用详解
http://blog.jjonline.cn/phptech/154.html
PHP命名空间(Namespace)的使用详解
http://www.cnblogs.com/kuyuecs/p/3556421.html
thinkphp use 加载文件
http://www.baidu.com/s?wd=thinkphp%20use%20加载文件
PHP命名空间动态访问及使用技巧
http://www.jb51.net/article/53856.htm
php namespace与use的问题
http://bbs.csdn.net/topics/390727877
http://www.baidu.com/s?wd=php%20namespace
http://www.sogou.com/web?query=php%20namespace
http://www.sogou.com/web?query=php%20namespace