使用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部分:有人可以向我解释第一个示例中我的期望有什么问题吗? 问题第二部分:行为与第一个示例如何一致?
答案 0 :(得分:5)
您观察到的行为不应使您感到困惑。 这是应该发生的事情。 这正是PHP名称空间的工作方式。
PHP manual解释:
PHP命名空间提供了一种对相关类,接口,函数和常量进行分组的方法。
不是变量。
这意味着代码中的$closure
与您定义的所有命名空间(A,B和C)中的变量完全相同。
它首先在名称空间A中定义。
然后,该值将在名称空间B中替换。
然后调用它包含在命名空间C中的闭包。
第二个示例是相同的。
因为名称空间不是用于对变量进行分组的,所以显然\A\$closure()
是无效的语法。