使用命名空间 - 别名和导入

允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 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
    {
        //
    }
}

results matching ""

    No results matching ""