gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:39:08 25 4
gpt4 key购买 nike

使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com