作用

  • 避免用户编写的代码与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函数
}
?>

解析规则

见此处

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注