# 命名空间和动态语言特征

PHP 命名空间的实现受到其语言自身的动态特征的影响。因此，如果要将下面的代码 `example.php` 转换到命名空间中：

```php
<?php

class Bar
{
    //
}

/**
 * Return the name of the current namespace.
 *
 * @param  void
 * @return string
 */
function bar(): string
{
    return __NAMESPACE__;
}

const BAR = __NAMESPACE__;

```

必须使用完全限定名称（包括命名空间前缀的类名称）。注意因为在动态的类名称、函数名称或常量名称中，限定名称和完全限定名称没有区别，因此其前导的反斜杠是不必要的。

```php
<?php

namespace Foo;

class Bar
{
    //
}

/**
 * Return the name of the current namespace.
 *
 * @param  void
 * @return string
 */
function bar(): string
{
    return __NAMESPACE__;
}

const BAR = __NAMESPACE__;

require __DIR__ . '/example.php';
$bar = 'Bar';
var_dump(new $bar);        // object(Bar)#1 (0) { }
$bar = 'bar';
var_dump($bar());          // string(0) ""
$bar = 'BAR';
var_dump(constant($bar));  // string(0) ""
$bar = '\Foo\Bar';
var_dump(new $bar);        // object(Foo\Bar)#1 (0) { }
$bar = 'Foo\Bar';
var_dump(new $bar);        // object(Foo\Bar)#1 (0) { }
$bar = '\Foo\bar';
var_dump($bar());          // string(3) "Foo"
$bar = 'Foo\bar';
var_dump($bar());          // string(3) "Foo"
$bar = '\Foo\BAR';
var_dump(constant($bar));  // string(3) "Foo"
$bar = 'Foo\BAR';
var_dump(constant($bar));  // string(3) "Foo"

```

