命名空间和动态语言特征
PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码 example.php
转换到命名空间中:
<?php
class Bar
{
//
}
/**
* Return the name of the current namespace.
*
* @param void
* @return string
*/
function bar(): string
{
return __NAMESPACE__;
}
const BAR = __NAMESPACE__;
必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。
<?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"