PHP 5.3中的命名空间:你用过了么?

 

命名空间是PHP 5.3中最重要的变化,对于C#和Java开发人员对这个词语非常熟悉了,他们终于可以更好地改变PHP应用程序的结构了。

为什么我们需要命名空间?

随着你的PHP代码库的增长,对之前定义的函数和类名进行修改时风险也更高了,当你试图增加第三方组件或插件时问题更严重,如果存在两个或两个以上的代码集实现了一个“Database”和“User”类会怎么样?

直到目前,唯一的解决办法是使用长的类/函数名,例如Wordpress在每个类和函数名前都使用了前缀“WP_”, Zend Framework使用了极具描述性的命名约定,导致类名非常冗长,如:

Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive

命名冲突问题可以使用命名空间来解决,PHP常量、类和函数可以被组合到命名空间库中。

如何定义命名空间?

默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

在PHP文件的顶部使用一个关键字namespace就可以定义命名空间,它必须是第一个命令(declare除外),在它前面不能出现非PHP代码、HTML或空格。如:


  1. 		< ?php  
  2. // define this code in the 'MyProject' namespace  
  3. namespace MyProject;  
  4.  
  5. // ... code ...  

这一行下面的代码都是指定给MyProject命名空间的,为相同代码块嵌套命名空间或定义多个命名空间是不可能的,如果你真这样干,只有最后一个命名空间才能识别,但你可以在同一个文件中定义不同的命名空间代码,如:


  1. 		< ?php  
  2. namespace MyProject1;  
  3. // PHP code for the MyProject1 namespace  
  4.  
  5. namespace MyProject2;  
  6. // PHP code for the MyProject2 namespace  
  7.  
  8. // Alternative syntax  
  9. namespace MyProject3 {  
  10.  // PHP code for the MyProject3 namespace  
  11. }  
  12. ?>  

尽管这么干是可以的,但我建议你不要这么做,最好还是每个文件中只定义一个命名空间,免得把你弄糊涂了。

子命名空间

PHP允许定义具有层次的命名空间以便库能够细分,子命名空间使用一个反斜线字符(\)分隔,如:

◆MyProject\SubName

◆MyProject\Database\MySQL

◆CompanyName\MyProject\Library\Common\Widget1

调用命名空间代码

在lib1.php文件中我们使用App\Lib1 namespace命名空间定义了一个常量、一个函数和一个类,如:

lib1.php


  1. 		< ?php  
  2. // application library 1  
  3. namespace App\Lib1;  
  4.  
  5. const MYCONST = 'App\Lib1\MYCONST';  
  6.  
  7. function MyFunction() {  
  8.  return __FUNCTION__;  
  9. }  
  10.  
  11. class MyClass {  
  12.  static function WhoAmI() {  
  13.   return __METHOD__;  
  14.  }  
  15. }  
  16. ?> 

现在我们可以在另一个PHP文件包括这段代码,如:

myapp.php


  1. 		< ?php  
  2. header('Content-type: text/plain');  
  3. require_once('lib1.php');  
  4.  
  5. echo \App\Lib1\MYCONST . "\n";  
  6. echo \App\Lib1\MyFunction() . "\n";  
  7. echo \App\Lib1\MyClass::WhoAmI() . "\n";  
  8. ?> 

在myapp.php中并没有定义命名空间,因此这段代码存在全局空间中,任何对MYCONST、MyFunction和MyClass的直接引用都会失败,因为它们存在于App\Lib1命名空间中,为了调用lib1.php中的代码,我们可以在\App\Lib1命名空间前添加前缀定义一个完全合格的名称,下面是我载入myapp.php时的输出结果:


  1. 		App\Lib1\MYCONST    
  2. App\Lib1\MyFunction    
  3. App\Lib1\MyClass::WhoAmI 

完全合格名称可以变得很长,定义长名称,如App-Lib1-MyClass,有一些明显的好处。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 函数
, 命名空间
, 代码
, 常量
, 空间
, 类名
php命名空间
php教程、php下载、php是什么、php开发工具、php文件怎么打开,以便于您获取更多的相关知识。

时间: 2024-10-30 16:04:59

PHP 5.3中的命名空间:你用过了么?的相关文章

在&amp;#106avascript中实现命名空间

命名空间 注:好久没写了,今天把我在公司内网写的文章拷一份,出来露露脸,刚转Web开发,所以开始学javascript! 在引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在.在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我

PHP中的命名空间详细介绍

  这篇文章主要介绍了PHP中的命名空间详细介绍,本文讲解了命名空间(namespace)的概念.正在使用命名空间.定义命名空间.子命名空间.从命名空间中调用代码等内容,需要的朋友可以参考下 概述 PHP对于命名空间的支持,经历了一段艰难的旅程.幸运的是,PHP从5.3开始引入了命名空间.自从PHP引入了命名空间,PHP代码的适用结构也得到了大大的改善.许多编程语言早就有了命名空间的概念,相对于其他语言来说,PHP对于命名空间的支持,稍微有点晚了.不管如何,每一种新特性的引入都有其目的,和其他语

PHP中的命名空间详细介绍_php技巧

概述 PHP对于命名空间的支持,经历了一段艰难的旅程.幸运的是,PHP从5.3开始引入了命名空间.自从PHP引入了命名空间,PHP代码的适用结构也得到了大大的改善.许多编程语言早就有了命名空间的概念,相对于其他语言来说,PHP对于命名空间的支持,稍微有点晚了.不管如何,每一种新特性的引入都有其目的,和其他语言一样,PHP引入命名空间也主要是为了解决名字冲突的问题. 命名空间(namespace)的概念 复制代码 代码如下: 当在字符串中使用命名空间名字的时候,一定不要忘了转义\ 可以将命名空间想

PHP中的命名空间相关概念浅析_php技巧

1. PHP中的命名空间是什么? 什么是命名空间?"从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件.另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /

.aspx中的命名空间设置实现代码_实用技巧

.aspx与.cs文件之间是继承关系,前者继承自后者,故,在.cs文件中写的Public方法可以在.aspx中调用,但Private方法则不能访问,就是这个道理. 在.CS文件中引用命名空间使用using namespace,而在.aspx文件中引用命名空间有两种方式: 1.使用<%@ import namespace="namespace" %> 2.在web.config文件中添加: 复制代码 代码如下: <system.web> <pages>

在JavaScript中实现命名空间_javascript技巧

注:好久没写了,今天把我在公司内网写的文章拷一份,出来露露脸,刚转Web开发,所以开始学javascript! 在引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在.在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,

怎么在.ascx中引入命名空间

问题描述 一个App_Code下BusinessLogicLayer文件夹里有AA.csAA.BusinessLogicLayer命名空间一个自定义控件文件夹里有BB.ascx页要引用AA.BusinessLogicLayer错误列表:命名空间"AA"中不存在类型或命名空间名称"BusinessLogicLayer"(是缺少程序集引用吗?)怎么解决 解决方案 解决方案二:using解决方案三:usingAA.BusinessLogicLayer;但是总是出错,,说找

解决neutron中不同命名空间的mac地址冲突

昨天我们的测试人员提了个bug,具体操作是这样的: 1. 新建VM(通过DHCP分配IP) 2. 绑定公网IP,通过公网IP,ssh登录之后,删除该VM. 3. 再新建VM,手动分配IP,IP使用步骤1中的内网IP. 4. 再绑定公网IP后,ssh验证,无法连接. 随后进行了复现: 虚拟机的ip和mac地址: 192.168.10.2 fa:16:3e:33:8e:7c 删除虚拟机后,重新创建,获取到的mac地址: fa:16:3e:be:1a:3e 在虚拟机内ping网关IP,发现ping不通

急急急!!ArcEngine中引用命名空间时错误

问题描述 本人刚开始学习AE开发,运行时提示IFeatureWorkspace在命名空间ESRI.ArcGIS.Geodatabase中定义错,请各位帮忙指点一下啊? 解决方案 解决方案二:路过帮顶=============11月6日,论坛升级公告,积分已经做了调整!http://topic.csdn.net/u/20081107/11/b27dc75f-14b1-4594-9de3-5b18d9e36a11.html此次调整增加了两个新的可用分获取渠道:1:帖子被推荐(加精)后,帖主可以获得8