【问题标题】:PHP Scope and globalPHP 范围和全局
【发布时间】:2013-11-15 11:09:05
【问题描述】:

我对 PHP 中的变量范围有点困惑。我已经阅读了 PHP 手册中关于范围、GLOBALS 和 global 的部分,但这在我正在构建的应用程序中似乎并不成立。在页面的开头我设置了一个像这样的变量

$vars = array( 'id' => '2', 'name' => 'john' );

然后我想在函数中使用它,所以我去:

function my_func() { global $var; foreach ($vars as $var) { echo $var; } }

但这不会起作用,除非我在第一次设置变量时还加上global $vars - 我真的需要在两个地方都设置这个全局变量吗?或者我做错了什么?

谢谢!

【问题讨论】:

    标签: php scope global


    【解决方案1】:

    全局变量在 imo 中很混乱且难以调试,请将其作为参数传递给您的函数。

    $array = array( 'id' => '2', 'name' => 'john' );
    
    function my_func($vars) {
        foreach ($vars as $var) { 
            echo $var; 
        } 
    }
    
    my_func($array);
    

    【讨论】:

    • 谢谢!那么这个链条是如何工作的呢?初始 var 被传递给函数调用,然后传递给实际函数,然后传递给 foreach?
    • 函数是预定义的。当您通过函数参数传递变量时,它可以在函数范围内随心所欲地执行。我已经重命名了变量,以便您更好地理解它。
    • @Malthe Milthers 听起来你可能对php.net/manual/en/functions.arguments.php 感兴趣。
    【解决方案2】:

    错字。

    global $var; 应该是global $vars;

    【讨论】:

    • 一个有效的解决方案,但请使用其他解决方案,并提示如何不使用全局变量。
    • ToBe 是对的。我只是指出为什么您的代码不起作用。
    【解决方案3】:

    实际上做错了什么 - 是使用全局变量。永远不要这样做,因为全局变量是副作用。它们产生的案例可能极难调试。想象一下,您在第 143 行包含的文件中有函数,该函数在第 2056 行的某处偶尔更改了您的变量,这也会导致您的所有逻辑中断。

    所以,真的,将变量作为参数传递

    function my_func($vars) 
    {
       foreach ($vars as $var) 
       {
          echo $var; 
       } 
    }
    

    至于您的代码 - 首先,使用空格。真的 - 对于解释器和编译器来说,它们并不重要,但对于会阅读该代码的人来说,看清楚图片非常重要。

    您的错误是您试图访问作为循环迭代器的全局变量,这是没有意义的,因为您的全局变量是您的 array,而不是临时循环迭代器。

    希望我的快速代码审查对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多