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 相关文章推荐
提问的智慧(2)
Oct 09 PHP
做一个有下拉功能的留言版
Oct 09 PHP
增加反向链接的101个方法 站长推荐
Jan 31 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
PHP编译安装时常见错误解决办法
May 28 PHP
详解WordPress中给链接添加查询字符串的方法
Dec 18 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP 模拟登陆功能实例详解
Sep 10 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 flv视频时间获取函数
2010/06/29 PHP
七款最流行的PHP本地服务器分享
2013/02/19 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
python中函数总结之装饰器闭包详解
2016/06/12 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
使用Python封装excel操作指南
2021/01/29 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
计算机毕业大学生推荐信
2013/12/01 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
锦旗标语大全
2014/06/23 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
Python实现对齐打印 format函数的用法
2022/04/28 Python
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript