php - 带有闭包的意外 namespace 行为

标签 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 部分:有人可以解释一下我在第一个示例中的期望有什么问题吗? 问题第 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/

相关文章:

php - PHP 5.2上函数的意外T_FUNCTION

php - 请求 Blade View 模板中使用的所有变量的列表

java - setNamespaceContext 默认命名空间

php - 如何避免无法为两个具有相同名称的不同类重新声明类

swift - swift 中带有可选闭包的参数

python - 向类添加动态函数; Python

php - 设置 mysql 连接到 php 并从多个 php 函数访问它们

php - 为什么我应该继续运行 artisan serve 命令来保持服务器正常工作?

python - URL 处出现 NoReverseMatch 错误,X 未注册命名空间

Javascript Closure 没有提供预期的结果