【问题标题】:Variable scope problem accessing outer variable访问外部变量的变量范围问题
【发布时间】:2009-09-07 17:46:15
【问题描述】:

我有一个层次很大的函数:

function func(){
    $a= 0; // Here the variable is 0
    while(...){
        echo $a; // gives me always 0
        for(...){
            if(...){
                if(...){
                    $num = func3();
                    $a = $num; // this $a does not corrospond to $a in the beginning
                }
            }
        }
    }
}

有谁知道我可以如何从嵌套范围更改$a 的值?

【问题讨论】:

  • 不是要打败 PHP,而是认真的?该代码不会更改func() 中声明的$a 的值吗?如果是这样,那就太疯狂了。我真的很重视解释 为什么 PHP 会做这样的事情的答案。对我来说似乎真的,真的很奇怪。
  • 我认为这个示例代码和您的代码之间存在差异,因为这肯定可以工作。
  • 或者 func3() 总是返回 0
  • 请发布真实代码,因为此代码设置 $a = func3() 的次数与 while 和 for 循环运行的次数一样多(减去 if 条件)。

标签: php variables scope


【解决方案1】:

在 PHP 5.3 之前,PHP 只有两个作用域:全局和局部函数作用域。 PHP 5.3 引入了闭包,这使作用域情况稍微复杂了一点,但看起来您并没有在这里使用它们。

与许多其他 C 风格的编程语言不同,括号/块确实调用另一个级别的范围。您在函数开头声明的$a 与您稍后访问的$a 相同。如果您在 $a 中获得的值是意外的,则可能是缺少的代码 (...) 正在更改其值,要么通过赋值,要么因为它通过引用传递给正在更改其值的其他函数。

【讨论】:

    【解决方案2】:

    您可能在以前的作用域中使用了 $a,或者 func3() 设置了“global $a;”或者可能永远不会到达 if 语句

    【讨论】:

      【解决方案3】:

      全局。

      global $a;
      
      func() {
        $a = 0;
        while() {
          echo $a;
          for() {
            if() {
              if() {
                $a = func3();
              }
            }
          }
        }
      }

      【讨论】:

      • 为什么投反对票?不抱怨,只是想更好地理解。
      • 1.因为使用全局范围几乎从来都不是正确的答案。 2. 问题不是作用域问题,因为 PHP 在遇到 {} 块时不会创建新作用域。
      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2015-07-20
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多