【发布时间】:2013-07-13 09:58:13
【问题描述】:
让我们忽略糟糕的设计并考虑在函数内部使用全局变量,但在默认命名空间中不是全局变量:
a();
function a() {
function b() {
global $x;
echo $x;
}
$x=10;
b();
}
变量$x 未打印到标准输出。然而,如果我们在函数a() 中声明global $x,那么它被打印到标准输出。有什么方法可以将$x 定义为a() 内部的全局变量(以便在b() 函数中可用)但不在默认命名空间的范围内?
编辑:假设要传递任意数量的变量,因此使用use() 或作为参数定义它们是不切实际的。
【问题讨论】:
-
嵌套函数从来都不是一个好主意;而且它们甚至没有嵌套,因为 a() 和 b() 都将在 PHP 的全局范围内创建....如果您尝试多次调用 a() 会出现潜在问题,因为它会告诉您 b( ) 已经定义了,代码不是很容易阅读,没有必要这样做,并且会出现变量范围问题,因为您不了解 b() 不在 a() 的范围内....也不尽管您将其标记为
oop,但它仍然可以识别 -
如果你真的需要函数内部的函数,使用闭包
-
也不清楚为什么不将变量作为明显的函数参数传递。
-
谢谢马克。我们可以将其视为更多的学术练习。一位同事已经按照这些思路编写了一些代码,我正在对其进行重构,但我仍然对此感兴趣,因为部分代码很难重构,我暂时将其保留。
-
@mario:因为这不是我的代码!实际上,有一大堆变量,函数有 10 多个参数是不可行的。
标签: php oop global-variables scope