PHP命名空间namespace使用小结

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 esearch amespacemarketfruitinc.php
E:myphp esearch amespacemarketfruitinc_test1.php
E:myphp esearch amespacemarketfruitinc_test2.php
E:myphp esearch amespacemarketfruitinc_test3.php
E:myphp esearch amespacemarketfruitinc_test4.php
E:myphp esearch amespacemarketfruitinc_test5.php
E:myphp esearch amespacemarketfruitinc_test6.php

inc.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 namespace marketfruit;
 7 class Apple {
 8     public function __construct($file = __FILE__) {
 9         echo sprintf("Inner |%s|, invoked by file:|%s|
", __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 marketfruitApple(__FILE__);
10 
11 //输出Inner |marketfruitApple::__construct|, invoked by file:|E:myphp
esearch
amespacemarketfruitinc_test1.php|
12 
13 //用new marketfruitApple(__FILE__); 或 new marketfruitApple(__FILE__);均输出同样的结果,即market前面有没有结果都一样
14 ?>

inc_test2.php

 1 <?php
 2 /*
 3  * @date 2016-4-8
 4  * @author caihuafeng
 5  */
 6 namespace marketfruit; //调整当前脚本到marketfruit这个命名空间,而且namespace申明必须在第一句
 7 include_once('inc.php');
 8 
 9 //由于上面第一行声明了类Apple的命名空间marketfruit,因此下面实例化类Apple的时候,就不需要在Apple前面加上命名空间market了
10 $apple = new Apple(__FILE__);
11 //输出Inner |marketfruitApple::__construct|, invoked by file:|E:myphp
esearch
amespacemarketfruitinc_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 //定义别名, marketfruitApple最后面Apple是类名,定义marketfruitApple的别名为mfa
 9 use marketfruitApple as mfa;
10 
11 //由于上面声明了定义marketfruitApple的别名为ma,因此下面可以直接用mfa代替marketfruitApple
12 $apple = new mfa(__FILE__);
13 //输出Inner |marketfruitApple::__construct|, invoked by file:|E:myphp
esearch
amespacemarketfruitinc_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 //定义别名, marketfruit是命名空间,定义marketfruit的别名为mf
 9 use marketfruit as mf;
10 //Warning: The use statement with non-compound name 'market' has no effect in E:myphp
esearch
amespacemarketinc_test4.php on line 5
11 
12 //由于上面声明了定义marketApple的别名为ma,因此下面可以直接用ma代替marketApple
13 $apple = new mfApple(__FILE__);
14 //输出Inner |marketfruitApple::__construct|, invoked by file:|E:myphp
esearch
amespacemarketfruitinc_test4.php|
15 
16 /*
17 如果将上述$apple = new mfApple(__FILE__);修改为$apple = new mfApple(__FILE__);[区别是在mf前面加上了,如果定义了别名,则在别名前面不需要加上],将会报如下的错误:
18 Fatal error: Class 'mfApple' not found in E:myphp
esearch
amespacemarketinc_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 marketfruit;
10 
11 //由于上面声明了use marketfruit,下面的实例化用fruit代替marketfruit
12 $apple = new fruitApple(__FILE__);
13 //输出Inner |marketfruitApple::__construct|, invoked by file:|E:myphp
esearch
amespacemarketfruitinc_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 marketfruitApple;
10 
11 //由于上面声明了use marketfruit,下面的实例化用fruit代替marketfruit
12 $apple = new Apple(__FILE__);
13 //输出Inner |marketfruitApple::__construct|, invoked by file:|E:myphp
esearch
amespacemarketfruitinc_test6.php|
14 ?>

b.测试二

E:myphp esearch amespacedemo.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
";
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__ . "
";
18     }
19 }
20 /*
21 同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class
22 下面一行相当于$Demo = new DemoNameSpaceDemo();
23 */
24 $Demo = new Demo();
25 
26 //调用DemoTest空间的Demo类
27 use DemoTestDemo 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

原文地址:https://www.cnblogs.com/caihuafeng/p/5366347.html