命名空间和动态语言特征

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"

results matching ""

    No results matching ""