PHP命名空间

75 阅读2分钟

命名空间

PHP 命名空间可以解决以下两类问题

  • 用户编写的代码定义的变量、方法、类等名字冲突
  • 建立别名,提高代码可读性

命名空间名称大小写不敏感命名空间必须是程序脚本的第一条语句


如果在某个文件定义命名空间,必须在文件开头

namespace myNameSpace;  

命名空间的名字可以使用分层次的方式定义

namespace a\b\c

也可以在文件不同的位置定义多个命名空间

<?php  
namespace a\namespace_1{
    $a = 'namespace_1';
}

namespace a\namespace_2{
	$a = 'namespace_2';
}
?>  

比如,建立两个命名空间,并分别访问其中命名空间下类的变量及方法

namespace Mobile;
class User{
    public $name = 'mobile user';
}

namespace TV ;
class User{
    public static $name = 'tv user';
}

$user = new \Mobile\User;
echo $user->name;
echo \TV\User::$name;

命名空间引入方式

非限定名称,或不包含前缀的类名称

$a=new foo(); 
foo::staticmethod();

如果当前命名空间是currentnamespace,foo 将被解析为currentnamespace\foo

如果使用foo的代码是全局的,不包含在任何命名空间中的代码,则foo会被解析为foo

如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称

namespace aaa;
$a = "a";

限定名称,或包含前缀的名称

$a = new subnamespace\foo();
subnamespace\foo::staticmethod();

如果当前的命名空间是currentnamespace,则 foo 会被解析为currentnamespace\subnamespace\foo

如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo

完全限定名称,或包含了全局前缀操作符的名称

$a = new \currentnamespace\foo(); 
\currentnamespace\foo::staticmethod();

在这种情况下,foo总是被解析为代码中的文字名\currentnamespace\foo


命名空间导入

PHP 命名空间支持有两种使用别名或导入方

  1. 为类名称使用别名
  2. 为命名空间名称使用别名
namespace foo;
use My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use \ArrayObject;

$obj = new namespace\Another; // 实例化 foo\Another 对象
$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象

use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 类
$obj = new \Another; // 实例化 Another 类
$obj = new Another\thing; // 实例化 My\Full\Classname\thing 类
$obj = new \Another\thing; // 实例化 Another\thing 类