(PHP 5 >= 5.3.0, PHP 7, PHP 8)
在说明名称解析规则之前,我们先看一些重要的定义:
名称中不包含命名空间分隔符的标识符,例如 Foo
名称中含有命名空间分隔符的标识符,例如 Foo\Bar
名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar
。 namespace\Foo
也是一个完全限定名称。
这是个以 namespace
开头的标识符, 例如 namespace\Foo\Bar
。
名称解析遵循下列规则:
\A\B
解析为 A\B
。 namespace
。 如果名称出现在全局命名空间,会截掉 namespace\
前缀。 例如,在命名空间 X\Y
里的 namespace\A
会被解析成 X\Y\A
。 在全局命名空间里,同样的名字却被解析成 A
。 A\B\C
被导入为 C
, 名称 C\D\E
会被翻译成 A\B\C\D\E
。 A\B
内的名称 C\D\E
会解析成 A\B\C\D\E
。 use A\B\C;
后,类似 new C()
这样的名称会解析为 A\B\C()
。 类似的,use function A\B\foo;
后, foo()
的用法,解析名称为 A\B\foo
。 A\B
内的 new C()
会把名称解析为 A\B\C
。 A\B
中, 下面演示了调用函数 foo()
是如何解析的: A\B\foo()
。 foo()
。 示例 #1 名称解析示例
<?php
namespace A;
use B\D, C\E as F;
// 函数调用
foo(); // 首先尝试调用定义在命名空间"A"中的函数foo()