使用命名空间 - 基础

在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的。可以将 PHP 命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:

  • 相对文件名如 foo.txt 。它会被解析为 CurrentDirectory/foo.txt ,其中 CurrentDirectory 表示当前目录。因此如果当前目录是 /home/foo ,则该文件名被解析为 /home/foo/foo.txt
  • 相对路径名如 SubDirectory/foo.txt 。它会被解析为 CurrentDirectory/SubDirectory/foo.txt
  • 绝对路径名如 /main/foo.txt 。它会被解析为 /main/foo.txt

PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:

  • 非限定名称,或不包含前缀的类名称,例如 $foo = new Foo 。如果当前命名空间是 CurrentNamespaceFoo 将被解析为 CurrentNamespace\Foo 。如果使用 Foo 的代码是全局的,不包含在任何命名空间中的代码,则 Foo 会被解析为 Foo
  • 限定名称,或包含前缀的名称,例如 $foo = new SubNamespace\Foo 。如果当前的命名空间是 CurrentNamespace ,则 Foo 会被解析为 CurrentNamespace\SubNamespace\Foo 。如果使用 Foo 的代码是全局的,不包含在任何命名空间中的代码, Foo 会被解析为 SubNamespace\Foo
  • 完全限定名称,或包含了全局前缀操作符的名称,例如, $foo = new \CurrentNamespace\Foo 。在这种情况下, Foo 总是被解析为代码中的文字名 CurrentNamespace\Foo
<?php

namespace Foo;

class Baz
{
    //
}

/**
 * Return the name of the current namespace.
 *
 * @param  void
 * @return string
 */
function baz(): string
{
    return __NAMESPACE__;
}

const BAZ = __NAMESPACE__;

require __DIR__ . '/example.php';
var_dump(new Baz());          // object(Foo\Baz)#1 (0) { }
var_dump(baz());              // string(3) "Foo"
var_dump(BAZ);                // string(3) "Foo"
var_dump(new Bar\Baz());      // object(Foo\Bar\Baz)#1 (0) { }
var_dump(Bar\baz());          // string(7) "Foo\Bar"
var_dump(Bar\BAZ);            // string(7) "Foo\Bar"
var_dump(new \Foo\Bar\Baz()); // object(Foo\Bar\Baz)#1 (0) { }
var_dump(\Foo\Bar\baz());     // string(7) "Foo\Bar"
var_dump(\Foo\Bar\BAZ);       // 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

namespace Foo;

require __DIR__ . '/example.php';
var_dump(foo()); // string(3) "foo"
var_dump(FOO);   // string(3) "foo"

上例中的 example.php 文件内容:

<?php

/**
 * Return a string.
 *
 * @param  void
 * @return string
 */
function foo(): string
{
    return 'foo';
}

const FOO = 'foo';

results matching ""

    No results matching ""