【问题标题】:Unexpected namespace behavior with closures带有闭包的意外命名空间行为
【发布时间】:2019-04-13 17:17:06
【问题描述】:

使用 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 部分:行为如何与第一个示例一致?

【问题讨论】:

  • 在命名空间中,您可以定义类、常量和函数。变量不是类,不是函数,不是常量。
  • 对于您的最后一个示例,我猜(但我不确定)$closure 变量在其命名空间末尾超出范围。但我不知道您如何在第一个示例中获得“B”。

标签: php namespaces closures


【解决方案1】:

您观察到的行为不应让您感到困惑。 这是应该发生的事情。 这正是 PHP 命名空间的工作原理。

PHP manual 解释:

PHP 命名空间提供了一种对相关类、接口、函数和常量进行分组的方法。

不是变量。

这意味着您代码中的$closure 与您定义的所有命名空间(A、B 和 C)中的变量完全相同。 它首先在命名空间 A 中定义。 然后在命名空间 B 中替换该值。 然后调用它包含在命名空间 C 中的闭包。

第二个例子也是一样的。 因为命名空间不用于对变量进行分组,所以很明显\A\$closure() 是一个无效的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 2013-09-23
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多