带有闭包的意外名称空间行为

Hak*_*iki 3 php closures namespaces

使用PHP 7.0,请考虑以下代码:

<?php
namespace A {
    $closure = function() {
        echo __NAMESPACE__;
    };
}
namespace B {
    $closure = function () {
        echo __NAMESPACE__;
    };
}
namespace C {
    $closure();
}
Run Code Online (Sandbox Code Playgroud)

对我来说,预期的输出将是:

PHP Notice:  Undefined variable: closure
Run Code Online (Sandbox Code Playgroud)

但是结果是

B
Run Code Online (Sandbox Code Playgroud)

然后考虑以下代码:

<?php
namespace A {
    $closure = function() {
        echo __NAMESPACE__;
    };
}
namespace B {
    $closure = function () {
        echo __NAMESPACE__;
    };
}
namespace C {
    \A\$closure();
}
Run Code Online (Sandbox Code Playgroud)

现在知道(但尚未理解)第一个示例的行为,对我的预期输出将是:

A
Run Code Online (Sandbox Code Playgroud)

但是我得到了

PHP Parse error:  syntax error, unexpected '$closure' (T_VARIABLE), expecting identifier (T_STRING)
Run Code Online (Sandbox Code Playgroud)

这种行为使我完全困惑。

问题第1部分:有人可以向我解释第一个示例中我的期望有什么问题吗?问题第二部分:行为与第一个示例如何一致?

Rei*_*Rei 6

您观察到的行为不应使您感到困惑。这是应该发生的事情。这正是PHP名称空间的工作方式。

PHP手册说明:

PHP命名空间提供了一种对相关类,接口,函数和常量进行分组的方法。

不是变量。

这意味着$closure在您的代码中,您定义的所有名称空间(A,B和C)中的变量都完全相同。首先在名称空间A中定义它。然后在名称空间B中替换该值。然后调用它在名称空间C中包含的闭包。

第二个例子是相同的。因为名称空间不用于对变量进行分组,所以显然这\A\$closure()是无效的语法。