为什么动态评估命名空间元素时必须使用完全限定的名称?

问题描述 投票:0回答:1

我一直试图理解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 namespaces php-7
1个回答
1
投票

来自PHP docs的更多进口商品:

导入是在编译时执行的,因此不会影响动态类,函数或常量名称。

我找不到这个决定的原因,但是我想这是以下因素的组合:

  1. 性能-在每次使用中解析动态名称的导入可能会非常昂贵。由于PHP及其字符串的动态特性,在编译期间无法完成此操作。
  2. 一致性和避免复杂性-为了使动态名称按照您描述的方式工作,必须解决几个问题,例如将它们传递给具有不同导入方式的不同脚本,序列化/反序列化等。

在我看来,将所有动态名称视为完全合格是最简单的解决方案。我也无法想象真实的用例,因为大多数代码根本不需要使用像这样的动态名称。

© www.soinside.com 2019 - 2024. All rights reserved.