我一直试图理解php.net手册中的Namespaces and dynamic language features一章。请考虑以下代码:
namespace Foo;
function strstr() {
echo "My local ststr method called";
}
$a = 'strstr';
$a(); //This would call the global strstr method
按照手册,我必须去$a = 'Foo\strstr'
,但是我找不到原因。为什么php解释器在运行时无法知道$a = 'strstr';
是在namespace Foo
的上下文中定义的,就像立即执行strstr()
一样,解释器还记得上下文在运行时是namespace Foo
。
[我能想到的一个原因是,如果满足特定条件(例如,如果接收到用户输入),则在事件上调用$a
,因为该功能仅绑定到该事件而没有任何上下文信息。
来自PHP docs的更多进口商品:
导入是在编译时执行的,因此不会影响动态类,函数或常量名称。
我找不到这个决定的原因,但是我想这是以下因素的组合:
在我看来,将所有动态名称视为完全合格是最简单的解决方案。我也无法想象真实的用例,因为大多数代码根本不需要使用像这样的动态名称。