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 09 PHP
php 变量定义方法
Jun 14 PHP
php 多线程上下文中安全写文件实现代码
Dec 28 PHP
初次接触php抽象工厂模式(Elgg)
Mar 21 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
Jan 20 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
实现php删除链表中重复的结点
Sep 27 PHP
TP3.2.3框架文件上传操作实例详解
Jan 23 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 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
PHP自动生成后台导航网址的最佳方法
2013/08/27 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
Python可跨平台实现获取按键的方法
2015/03/05 Python
Python中random模块生成随机数详解
2016/03/10 Python
Python简单生成随机数的方法示例
2018/03/31 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
django和vue实现数据交互的方法
2019/08/21 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
Solaris操作系统的线程机制
2015/07/28 面试题
在校生自我鉴定
2014/01/23 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
升职自我推荐信范文
2015/03/25 职场文书
税务会计岗位职责
2015/04/02 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
导游词之沈阳植物园
2019/11/30 职场文书
python实现三次密码验证的示例
2021/04/29 Python