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 相关文章推荐
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
Oct 09 PHP
php zip文件解压类代码
Dec 02 PHP
PHP数据库调用类调用实例(详细注释)
Jul 12 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
注意:php5.4删除了session_unregister函数
Aug 05 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 PHP
php+mysql实现数据库随机重排实例
Oct 17 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
Apr 09 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 13 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获取当前url的具体方法全面解析
2013/11/26 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
python实现聚类算法原理
2018/02/12 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
django项目搭建与Session使用详解
2018/10/10 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
违反工作纪律检讨书
2014/02/15 职场文书
服装发布会策划方案
2014/05/22 职场文书
匿名检举信范文
2015/03/02 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书