使用命名空间 - 别名和导入
允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 Unix 文件系统中可以创建对其它的文件或目录的符号连接。所有支持命名空间的 PHP 版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。也允许导入函数或常量或者为它们设置别名。在 PHP 中,别名是通过操作符 use
来实现的。
<?php
namespace Foo;
use ArrayObject;
use Foo\Bar\Baz;
use Foo\Bar\Baz as ClassBaz;
use function Foo\Bar\baz;
use function Foo\Bar\baz as FunctionBaz;
use const Foo\Bar\BAZ;
use const Foo\Bar\BAZ as ConstantBaz;
require __DIR__ . '/example.php';
var_dump(new ArrayObject()); // object(ArrayObject)#1 (1) { ["storage":"ArrayObject":private]=> array(0) { } }
var_dump(new Baz()); // object(Foo\Bar\Baz)#1 (0) { }
var_dump(new ClassBaz()); // object(Foo\Bar\Baz)#1 (0) { }
var_dump(baz()); // string(7) "Foo\Bar"
var_dump(FunctionBaz()); // string(7) "Foo\Bar"
var_dump(BAZ); // string(7) "Foo\Bar"
var_dump(ConstantBaz); // string(7) "Foo\Bar"
上例中的 example.php
文件内容:
<?php
namespace Foo\Bar;
class Baz
{
//
}
/**
* Return the name of the current namespace.
*
* @param void
* @return string
*/
function baz(): string
{
return __NAMESPACE__;
}
const BAZ = __NAMESPACE__;
注意对命名空间中的名称来说,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。为了简化操作, PHP 还支持在一行中使用多个 use
语句。
<?php
use Foo\Bar\Baz, Foo\Bar;
require __DIR__ . '/example.php';
var_dump(new Baz()); // object(Foo\Bar\Baz)#1 (0) { }
var_dump(new Bar\Baz()); // object(Foo\Bar\Baz)#1 (0) { }
上例中的 example.php
文件内容:
<?php
namespace Foo\Bar;
class Baz
{
//
}
导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。
<?php
use Foo\Bar\Baz;
require __DIR__ . '/example.php';
$baz = 'Baz';
var_dump(new Baz()); // object(Foo\Bar\Baz)#1 (0) { }
var_dump(new $baz); // PHP Fatal error: Uncaught Error: Class 'Baz' not found.
上例中的 example.php
文件内容:
<?php
namespace Foo\Bar;
class Baz
{
//
}
另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。
<?php
use Foo\Bar\Baz;
require __DIR__ . '/example.php';
var_dump(new Baz()); // object(Foo\Bar\Baz)#1 (0) { }
var_dump(new \Baz()); // object(Baz)#1 (0) { }
上例中的 example.php
文件内容:
<?php
namespace Foo\Bar
{
class Baz
{
//
}
}
namespace
{
class Baz
{
//
}
}