使用 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 部分:有人可以解释一下我在第一个示例中的期望有什么问题吗? 问题第 2 部分:行为如何与第一个示例一致?
最佳答案
您观察到的行为不会让您感到困惑。 这是应该发生的事情。 这正是 PHP 命名空间的工作方式。
PHP manual解释:
PHP Namespaces provide a way in which to group related classes, interfaces, functions and constants.
不是变量。
这意味着您代码中的 $closure
与您定义的所有 namespace (A、B 和 C)中的变量完全相同。
它首先在命名空间 A 中定义。
然后该值在命名空间 B 中被替换。
然后调用它包含在命名空间 C 中的闭包。
第二个例子是一样的。
因为 namespace 不用于对变量进行分组,所以 \A\$closure()
显然是无效语法。
关于php - 带有闭包的意外 namespace 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53237533/