PHP中的命名空间相关概念浅析


Posted in PHP onJanuary 22, 2015

1. PHP中的命名空间是什么?

什么是命名空间?“从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。”——命名空间概述

2. PHP命名空间该如何理解?

从本质上讲,命名空间就是一个容器,这个容器内我们可以放入类、函数和变量,他们在同一命名空间内可以无条件相互访问。在命名空间之外,就必须引用或者导入其他命名空间,才能调用它们包含的这些项。

命名空间跟shell中的文件目录的概念是一样一样的。在当前目录下可以直接用文件名访问所有文件,如果需要访问其他目录下的文件,就需要输入相对路径或绝对路径。

引用方式:

namespace foo;

 class Foo {   

         public function foo()   

             {        

                  return \top\namespace\bar\Bar::fuck();    

              }

             }

导入方式:
namespace foo; 

use top\namespace\bar\Bar; 

 class Foo {

        public function foo() 

            {        return Bar::fuck();  

            }

           }

导入就相当于将目的类复制一份到当前命名空间中。

3. PHP命名空间有何实际应用?

命名空间的存在是为了解决下面两个问题:

1). 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

2). 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

4. 一些tips

1. 同一个空间下的类直接相互直接调用,属于一家。例如 Laravel 中的 PageController 类中可以直接写 Page::all() 这样的代码来调用 Page 这个model,因为他们俩都在顶级命名空间下。

2. 若一个类存在于非顶级命名空间中,那么它只能在调用同样是当前命名空间下的其他类才不用“引用”或“导入”,它们属于一家。任何子命名空间都是另一个命名空间,另一个容器,没有除了容器之间关系之外的任何特殊关系。

3. Laravel 采用 classmap 方式进行自动加载(autoload),PHP虽然有了命名空间这个高级特性,但是这只是逻辑关系,require 文件还是要有的。这个类和文件的对应关系就存在 /vendor/composer/autoload_classmap.php ,每次 composer dump-autoload 都会重新编译、生成。

PHP 相关文章推荐
php 无限级 SelectTree 类
May 19 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
php5.2以下版本无json_decode函数的解决方法
May 25 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
ThinkPHP 404页面的设置方法
Jan 14 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
May 27 PHP
示例详解Laravel的注册重构
Aug 14 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
Oct 20 PHP
ThinkPHP 模板引擎使用详解
May 07 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
php+mysql开发中的经验与常识小结
Mar 25 PHP
php curl操作API接口类完整示例
May 21 PHP
PHP生成随机数的方法实例分析
Jan 22 #PHP
9条PHP编程小知识及易犯的小错误
Jan 22 #PHP
PHP将HTML转换成文本的实现代码
Jan 21 #PHP
php使用Cookie控制访问授权的方法
Jan 21 #PHP
PHP+MySQL修改记录的方法
Jan 21 #PHP
PHP+MySQL删除操作实例
Jan 21 #PHP
PHP+MySQL插入操作实例
Jan 21 #PHP
You might like
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
php设置编码格式的方法
2013/03/05 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
2017/01/20 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
python实现批量图片格式转换
2020/06/16 Python
使用python实现滑动验证码功能
2019/08/05 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
python nmap实现端口扫描器教程
2020/05/28 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
日本航空官方网站:JAL
2019/06/19 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
交通事故赔偿协议书
2014/04/15 职场文书
平安工地建设方案
2014/05/06 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android