PHP命名空间namespace使用小结
2016-04-08 01:43
676 查看
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
inc_test1.php
inc_test2.php
inc_test3.php
inc_test4.php
inc_test5.php
inc_test6.php
b.测试二
E:\myphp\research\namespace\demo.php
延伸阅读:
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
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 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
<?php /* * @date 2016-4-8 * @author caihuafeng */ namespace market\fruit; class Apple { public function __construct($file = __FILE__) { echo sprintf("Inner |%s|, invoked by file:|%s|\n", __METHOD__, $file); } } ?>
inc_test1.php
<?php /* * @date 2016-4-8 * @author caihuafeng */ include_once('inc.php'); //实例化类Apple时直接在前面加上命名空间 $apple = new \market\fruit\Apple(__FILE__); //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test1.php| //用new market\fruit\Apple(__FILE__); 或 new \market\fruit\Apple(__FILE__);均输出同样的结果,即market前面有没有\结果都一样 ?>
inc_test2.php
<?php /* * @date 2016-4-8 * @author caihuafeng */ namespace market\fruit; //调整当前脚本到market\fruit这个命名空间,而且namespace申明必须在第一句 include_once('inc.php'); //由于上面第一行声明了类Apple的命名空间market\fruit,因此下面实例化类Apple的时候,就不需要在Apple前面加上命名空间market了 $apple = new Apple(__FILE__); //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test2.php| ?>
inc_test3.php
<?php /* * @date 2016-4-8 * @author caihuafeng */ include_once('inc.php'); //定义别名, market\fruit\Apple最后面Apple是类名,定义market\fruit\Apple的别名为mfa use market\fruit\Apple as mfa; //由于上面声明了定义market\fruit\Apple的别名为ma,因此下面可以直接用mfa代替market\fruit\Apple $apple = new mfa(__FILE__); //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test3.php| ?>
inc_test4.php
<?php /* * @date 2016-4-8 * @author caihuafeng */ include_once('inc.php'); //定义别名, market\fruit是命名空间,定义market\fruit的别名为mf use market\fruit as mf; //Warning: The use statement with non-compound name 'market' has no effect in E:\myphp\research\namespace\market\inc_test4.php on line 5 //由于上面声明了定义market\Apple的别名为ma,因此下面可以直接用ma代替market\Apple $apple = new mf\Apple(__FILE__); //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test4.php| /* 如果将上述$apple = new mf\Apple(__FILE__);修改为$apple = new \mf\Apple(__FILE__);[区别是在mf前面加上了\,如果定义了别名,则在别名前面不需要加上\],将会报如下的错误: Fatal error: Class 'mf\Apple' not found in E:\myphp\research\namespace\market\inc_test4.php on line 9 */ ?>
inc_test5.php
<?php /* * @date 2016-4-8 * @author caihuafeng */ include_once('inc.php'); //如果省略后面的as ....,那么,就可以直接用最后一节的文字来fruit代替 use market\fruit; //由于上面声明了use market\fruit,下面的实例化用fruit代替market\fruit $apple = new fruit\Apple(__FILE__); //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test5.php| ?>
inc_test6.php
<?php /* * @date 2016-4-8 * @author caihuafeng */ include_once('inc.php'); //如果省略后面的as ....,那么,就可以直接用最后一节的文字来Apple代替 use market\fruit\Apple; //由于上面声明了use market\fruit,下面的实例化用fruit代替market\fruit $apple = new Apple(__FILE__); //输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test6.php| ?>
b.测试二
E:\myphp\research\namespace\demo.php
<?php /* * @date 2016-4-8 * @author caihuafeng * 命名空间下直接new该命名空间中的class名称,可以省略掉use语法,这是php按脚本书写顺序执行导致的。例如如下代码是可以运行的 */ namespace DemoTest; class Demo { public function __construct() { echo "this is a test script\n"; } } namespace DemoNameSpace; class Demo { public function __construct() { echo 'This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is '.__NAMESPACE__ . "\n"; } } /* 同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class 下面一行相当于$Demo = new \DemoNameSpace\Demo(); */ $Demo = new Demo(); //调用DemoTest空间的Demo类 use DemoTest\Demo as d; $d = new d(); /* 输出 This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is DemoNameSpace this is a test script */ /* 这个结果表明,同一脚本下new一个没有指定use哪个命名空间时,会顺着该脚本,使用最靠近new语句之前的一个命名空间中的class */ ?>
延伸阅读:
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
相关文章推荐
- php的tips(数组排序函数)
- 初识PHP(二)常用函数
- php实习的tips(结束符的问题)
- php的tips(接口结束符问题)
- laravel学习(一)-laravel安装
- php 字符串函数汇总
- php使用ajax中文乱码问题
- PHP中__autoload和Smarty冲突的简单解决方法
- PHP使用PDO操作数据库的乱码问题解决方法
- php生成带logo二维码方法小结
- PHP实现基于mysqli的Model基类完整实例
- PHP文件上传类实例详解
- PHP实现简单实用的分页类代码
- IIS+PHP环境下文件上传无法访问问题
- PHP新特性
- PHP OCR实战:用Tesseract从图像中读取文字
- Web端PHP代码函数覆盖率测试解决方案
- PHP实现基于文本的莫斯电码生成器
- PHP设计模式之适配器模式
- php常用的排序算法与二分法查找