命名空间概述
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。
- <?php
- namespace my \ name ; // 参考 "定义命名空间" 小节
- class MyClass {}
- function myfunction () {}
- const MYCONST = 1 ;
- $a = new MyClass ;
- $c = new \ my \ name \ MyClass ; // 参考 "全局空间" 小节
- $a = strlen ( 'hi' ); // 参考 "使用命名空间:后备全局函数/常量" 小节
- $d = namespace\ MYCONST ; // 参考 "namespace操作符和__NAMESPACE__常量” 小节
- $d = __NAMESPACE__ . '\MYCONST' ;
- echo constant ( $d ); // 参考 "命名空间和动态语言特征" 小节
定义命名空间
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。
命名空间通过关键字namespace来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。
- <?php
- namespace MyProject ;
- const CONNECT_OK = 1 ;
- class Connection { /* ... */ }
- function connect () { /* ... */ }
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前:
- <html>
- <?php
- namespace MyProject ; // 致命错误 - 命名空间必须是程序脚本的第一条语句
- ?>
定义子命名空间
与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
- <?php
- namespace MyProject \ Sub \ Level ;
- const CONNECT_OK = 1 ;
- class Connection { /* ... */ }
- function connect () { /* ... */ }
在同一个文件中定义多个命名空间
也可以在同一个文件中定义多个命名空间。在同一个文件中定义多个命名空间有两种语法形式。
简单组合语法
- <?php
- namespace MyProject ;
- const CONNECT_OK = 1 ;
- class Connection { /* ... */ }
- function connect () { /* ... */ }
- namespace AnotherProject ;
- const CONNECT_OK = 1 ;
- class Connection { /* ... */ }
- function connect () { /* ... */ }
- ?>
不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法。
- <?php
- namespace MyProject {
- const CONNECT_OK = 1 ;
- class Connection { /* ... */ }
- function connect () { /* ... */ }
- }
- namespace AnotherProject {
- const CONNECT_OK = 1 ;
- class Connection { /* ... */ }
- function connect () { /* ... */ }
- }
- ?>
namespace关键字和__NAMESPACE__常量
PHP支持两种抽象的访问当前命名空间内部元素的方法, __NAMESPACE__ 魔术常量和namespace关键字。
常量 __NAMESPACE__ 的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
- <?php
- namespace MyProject ;
- echo '"' , __NAMESPACE__ , '"' ; // 输出 "MyProject"