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 相关文章推荐
MYSQL环境变量设置方法
Jan 15 PHP
php中的观察者模式
Mar 24 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
Nov 13 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
PHP中Trait及其应用详解
Feb 14 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
php提供实现反射的方法和实例代码
Sep 17 PHP
PHP isset empty函数相关面试题及解析
Dec 11 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
php学习笔记之 函数声明
2011/06/09 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
php实现简单的上传进度条
2015/11/17 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
详解微信小程序的 request 封装示例
2018/08/21 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
python requests 使用快速入门
2017/08/31 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
python单例模式的多种实现方法
2019/07/26 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python二维键值数组生成转json的例子
2019/12/06 Python
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
经典优秀个人求职自荐信格式
2013/09/25 职场文书
《石榴》教学反思
2014/03/02 职场文书
实习单位鉴定意见
2015/06/04 职场文书
公司仓库管理制度
2015/08/04 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
Selenium浏览器自动化如何上传文件
2022/04/06 Python
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers