【问题标题】:Variable scope for global inside functions全局内部函数的变量范围
【发布时间】: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


【解决方案1】:

忽略糟糕的设计或为什么不只是将其作为参数传递,您可以使用闭包和匿名函数,如果在定义函数之前定义参数:

function a() {
    $x = 10;

    $b = function() use($x) {
        echo $x; // 10
    };

    $b();
}

a();
echo $x; // Undefined variable

【讨论】:

  • 虽然很聪明,但这仍然需要在use() 中定义每个变量。我将更新问题以解决任意大量变量的情况。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 2016-11-13
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多