PHP支持两种抽象的访问当前命名空间内部元素的方法,NAMESPACE 魔术常量和namespace关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

示例1:__NAMESPACE__

<?php 
namespace Mytest; //定义命名空间
echo __NAMESPACE__;  //输出  Mytest

示例2:__NAMESPACE__全局代码

<?php
echo '"', __NAMESPACE__, '"'; // 输出 ""

示例3:示例2:__NAMESPACE__动态创建名称

<?php
namespace MyProject;

function get($classname)
{
		$a = __NAMESPACE__ . '\\' . $classname;
		return new $a;
}

关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符

示例4:namespace操作符,命名空间中的代码

<?php
namespace MyProject;

use blah\blah as mine; // 别名

blah\mine(); // 调用函数 blah\blah\mine()
namespace\blah\mine(); // 调用当前命名空间下函数 MyProject\blah\mine()

namespace\func(); // 调用当前命名空间下函数 MyProject\func()
namespace\sub\func(); // 调用当前命名空间下函数 MyProject\sub\func()
namespace\cname::method(); // 调用当前命名空间下的类 MyProject\cname的静态方法
$a = new namespace\sub\cname(); // 实例化类 MyProject\sub\cname
$b = namespace\CONSTANT; // 把当前命名空间下的常量 MyProject\CONSTANT 赋值给$b

示例5:namespace操作符, 全局代码

<?php

namespace\func(); // 调用全局下的函数 func()
namespace\sub\func(); // 调用全局下的函数 sub\func()
namespace\cname::method(); // 调用全局下的类 cname的静态方法
$a = new namespace\sub\cname(); // 实例化类 sub\cname
$b = namespace\CONSTANT; // 把全局常量 CONSTANT 赋值给$b

别名/导入

允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 unix 文件系统中可以创建对其它的文件或目录的符号连接。

所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名。

在PHP中,别名是通过操作符 use 来实现的.

示例1:使用use操作符导入/使用别名

<?php
namespace foo;
use My\Full\Classname as Another;

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

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

// 导入一个函数(PHP 5.6+)
use function My\Full\functionName;

// 导入函数并使用别名 (PHP 5.6+)
use function My\Full\functionName as func;

// 导入常量 (PHP 5.6+)
use const My\Full\CONSTANT;

$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 对象
func(); // 调用函数 My\Full\functionName
echo CONSTANT; // 输出 My\Full\CONSTANT的值

注意对命名空间中的名称(包含命名空间分隔符的完全限定名称如 Foo\Bar以及相对的不包含命名空间分隔符的全局名称如 FooBar)来说,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。 为了简化操作,PHP还支持在一行中使用多个use语句

示例2:通过use操作符导入/使用别名,一行中包含多个use语句

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func

导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。

示例3:导入和动态名称

<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a;      // 实际化一个 Another 对象

另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。

示例4:导入和完全限定名称

<?php
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\thinging