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

时间:2018-11-10 09:15:27

标签: php namespaces closures

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

<?php
namespace A {
    $closure = function() {
        echo __NAMESPACE__;
    };
}
namespace B {
    $closure = function () {
        echo __NAMESPACE__;
    };
}
namespace C {
    $closure();
}

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

PHP Notice:  Undefined variable: closure

但是结果是

B

然后在下面考虑以下代码:

<?php
namespace A {
    $closure = function() {
        echo __NAMESPACE__;
    };
}
namespace B {
    $closure = function () {
        echo __NAMESPACE__;
    };
}
namespace C {
    \A\$closure();
}

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

A

但是我得到了

PHP Parse error:  syntax error, unexpected '$closure' (T_VARIABLE), expecting identifier (T_STRING)

这种行为使我完全困惑。

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

1 个答案:

答案 0 :(得分:5)

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

PHP manual解释:

  

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

不是变量。

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

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