使用命名空间 - 基础
在讨论如何使用命名空间之前,必须了解 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
。如果当前命名空间是CurrentNamespace
,Foo
将被解析为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';