# 名称解析规则

在说明名称解析规则之前，先看一些重要的定义：

* 非限定名称，名称中不包含命名空间分隔符的标识符，例如 `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` 。

为了引用全局命名空间中的全局类，必须使用完全限定名称。