名称解析规则
在说明名称解析规则之前,先看一些重要的定义:
- 非限定名称,名称中不包含命名空间分隔符的标识符,例如
Foo
。 - 限定名称,名称中含有命名空间分隔符的标识符,例如
Foo\Bar
。 - 完全限定名称,名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如
\Foo\Bar
。namespace\Foo
也是一个完全限定名称。
名称解析遵循下列规则:
- 对完全限定名称的函数,类和常量的调用在编译时解析。例如
new \Foo\Bar
解析为类Foo\Bar
。 - 所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间
Foo\Bar
被导入为Bar
,那么对Bar\Baz
的调用就会被转换为Foo\Bar\Baz
。 - 在命名空间内部,所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如,在命名空间
Foo\Bar
内部调用Baz\Qux
,则Baz\Qux
会被转换为Foo\Bar\Baz\Qux
。 - 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如,如果命名空间
Foo\Bar\Baz
导入为Baz
,则new Baz
被转换为new Foo\Bar\Baz
。 - 在命名空间内部(例如
Foo\Bar
),对非限定名称的函数调用是在运行时解析的。例如对函数foo()
的调用是这样解析的:- 在当前命名空间中查找名为
Foo\Bar\foo()
的函数。 - 尝试查找并调用全局空间中的函数
foo()
。
- 在当前命名空间中查找名为
- 在命名空间(例如
Foo\Bar
)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用new Baz
的解析过程:- 在当前命名空间中查找
Foo\Bar\Baz
类。 - 尝试自动装载类
Foo\Bar\Baz
。
- 在当前命名空间中查找
为了引用全局命名空间中的全局类,必须使用完全限定名称。