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

译文
开发 后端
日前发布的PHP 5.3中,最重要的一个新特性就是命名空间的加入。命名空间对于C#和Java开发者而言都不是新事物了,不过这次出现在PHP当中还是有着相当重要的意义。

【51CTO精选译文】命名空间是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,有一些明显的好处。

原文:How to Use PHP Namespaces, Part 1: The Basics

作者:Craig Buckler

【编辑推荐】

  1. PHP 5.3中的命名空间使用方法浅述
  2. PHP 5.3.0发布 新增命名空间等多项特性
  3. PHP的命名空间
  4. PHP 5.3闭包语法初探
  5. PHP 5.3新版特性浅析
责任编辑:yangsai 来源: 51CTO.com
相关推荐

2009-07-17 09:31:06

PHP 5.3命名空间

2023-12-22 16:39:47

Java函数式接口开发

2022-05-18 08:00:26

函数劫持JavaScript钩子函数

2021-02-22 09:10:10

数字人民币DCEP区块链

2020-08-23 09:18:30

Pandas函数数据分析

2010-11-26 09:45:56

2023-10-10 08:33:40

编程范式命令式编程

2014-12-23 14:36:32

PHP

2019-11-17 22:20:57

Python编程语言程序员

2020-12-28 06:20:27

OptionalTryjava

2010-07-05 16:33:00

PHPPHP命名空间

2009-08-25 10:58:41

PHP命名空间

2022-05-27 09:02:31

Openbase开源前端

2010-07-09 09:01:55

2009-07-16 15:02:33

Shapes命名空间Net Micro F

2009-03-23 10:53:00

PHP5.3新特性PHP5.3PHP5

2020-07-13 07:00:21

Kubernetes

2009-07-01 09:32:11

PHP 5.3.0

2009-05-13 14:15:09

PHP 5.3闭包匿名函数

2009-11-23 14:17:50

PHP 5.3闭包语法
点赞
收藏

51CTO技术栈公众号