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 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
Oct 22 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
Jul 03 PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 PHP
php插件Xajax使用方法详解
Aug 31 PHP
如何直接访问php实例对象中的private属性详解
Oct 12 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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支付宝当面付2.0代码
2018/12/21 PHP
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
2013/10/15 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
浅谈struts1 & jquery form 文件异步上传
2017/05/25 jQuery
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
python dlib人脸识别代码实例
2019/04/04 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
Python实现像awk一样分割字符串
2020/09/15 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
婚礼证婚人证婚词
2014/01/13 职场文书
简历上的自我评价怎么写
2014/01/28 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
安全生产责任书范本
2014/04/15 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
水电工岗位职责
2015/02/14 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python