PHP-7命名空间
作用:
- 避免用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突
- 为很长的标识符名称创建一个简短别名,提高源代码的可读性
定义命名空间
- 默认情况下,所有常量、类和函数名都放在全局空间下
- 命名空间通过关键字
namespace
来声明 - 同一个文件中可以定义不同的命名空间
- 建议格式:空间内代码写在
{}
内
<?php //在其它代码前声明命名空间 namespace akm { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } //另一个命名空间 namespace m4a1 { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } ?>
注意
- 全局空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法
- 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前
- PHP 命名空间允许指定层次化的命名空间的名称,类似与目录和文件结构
<?php //声明分层次的单个命名空间 namespace weapon\rifle\akm { const CONNECT_OK = 1; class Connection { /* ... */ } function Connect() { /* ... */ } } ?>
使用命名空间
非限定名称
不指定特定的命名空间
<?php $a=new ammo(); //没有指定特定的命名空间 //或者 $a = ammo::staticmethod(); //如果当前命名空间是 akm,ammo 将被解析为 akm\ammo。 //如果使用 ammo 的代码是全局的,不包含在任何命名空间中的代码,则 ammo 会被解析为ammo ?>
限定名称
指定子命名空间
<?php $a=new akm\ammo(); //指定子命名空间 //或者 $a = akm\ammo::staticmethod(); //如果当前命名空间是 rifle,ammo 将被解析为 akm\ammo。 //如果使用 ammo 的代码是全局的,不包含在任何命名空间中的代码,ammo 会被解析为akm/ammo。 ?>
完全限定名称
指定完整的命名空间
<?php $a=new rifle\akm\ammo(); //指定完整命名空间 //或者 $a = rifle\akm\ammo::staticmethod(); //ammo 将被解析为rifle\akm\ammo。 ?>
使用全局空间
在名称前加上前缀\
表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
<?php namespace weapon\rifle\m4a1 { $f = \ammo(...); // 调用全局的ammo函数 } ?>