UNPKG

manual-php

Version:
147 lines (102 loc) 2.99 kB
# 使用命名空间 - 别名和导入 允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 Unix 文件系统中可以创建对其它的文件或目录的符号连接。所有支持命名空间的 PHP 版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。也允许导入函数或常量或者为它们设置别名。在 PHP 中,别名是通过操作符 `use` 来实现的。 ```php <?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 <?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 <?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 <?php namespace Foo\Bar; class Baz { // } ``` 导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。 ```php <?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 <?php namespace Foo\Bar; class Baz { // } ``` 另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。 ```php <?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 <?php namespace Foo\Bar { class Baz { // } } namespace { class Baz { // } } ```