PHP命名空间namespace使用小结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHP命名空间namespace使用小结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5635字,纯文字阅读大概需要9分钟。
内容图文
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*/ 6namespace market\fruit; 7class Apple { 8public 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__); 1011//输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test1.php| 1213//用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*/ 6namespace 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; 1011//由于上面声明了定义market\fruit\Apple的别名为ma,因此下面可以直接用mfa代替market\fruit\Apple12 $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 1112//由于上面声明了定义market\Apple的别名为ma,因此下面可以直接用ma代替market\Apple13 $apple = new mf\Apple(__FILE__); 14//输出Inner |market\fruit\Apple::__construct|, invoked by file:|E:\myphp\research\namespace\market\fruit\inc_test4.php|1516/*17如果将上述$apple = new mf\Apple(__FILE__);修改为$apple = new \mf\Apple(__FILE__);[区别是在mf前面加上了\,如果定义了别名,则在别名前面不需要加上\],将会报如下的错误: 18Fatal 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代替 9use market\fruit; 1011//由于上面声明了use market\fruit,下面的实例化用fruit代替market\fruit12 $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代替 9use market\fruit\Apple; 1011//由于上面声明了use market\fruit,下面的实例化用fruit代替market\fruit12 $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*/ 7namespace DemoTest; 8class Demo { 9public function __construct() { 10 echo "this is a test script\n"; 11 } 12} 1314namespace DemoNameSpace; 15class Demo { 16public 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(); 2526//调用DemoTest空间的Demo类27 use DemoTest\Demo as d; 28 $d = new d(); 2930/*31输出 32This is namespace of PHP demo ,The Demo magic constant "__NAMESPACE__" is DemoNameSpace 33this is a test script 34*/3536/*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
原文:http://www.cnblogs.com/caihuafeng/p/5366347.html
内容总结
以上是互联网集市为您收集整理的PHP命名空间namespace使用小结全部内容,希望文章能够帮你解决PHP命名空间namespace使用小结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。