# 使用命名空间 - 基础

在讨论如何使用命名空间之前，必须了解 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
<?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
<?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
<?php

namespace Foo;

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

```

上例中的 `example.php` 文件内容：

```php
<?php

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

const FOO = 'foo';

```

