【问题标题】:Declaring a global array声明一个全局数组
【发布时间】:2012-10-04 06:45:40
【问题描述】:

嗨。我最近学习了 PHP,并试图声明一个全局数组,以便可以在函数内部访问。但我似乎遗漏了一些东西,因为我收到错误“未定义的变量:”

这是我的代码:

global $second_array;
$second_array = array();

function operatii($v) {
  $var1 = $second_array[count($second_array)-1];
  $var2 = $second_array[count($second_array)-2];
  $rez = null;

  echo $var1 . $var2 . "este?";
}

for ($i = 0; $i < count($a); $i++){
  if ($a[$i] === "+" || $a[$i] === "-" || $a[$i] === "*" || $a[$i] === "/" ) {
    operatii($a[$i]);
  } else {
    array_push($second_array, $a[$i]);
  }
}

我似乎可以在for循环中使用$second_array,但不能在operatii函数中使用它。
我该如何解决这个问题?

【问题讨论】:

  • 如果要在函数内部访问它,请将其作为参数传递。
  • global 关键字需要在函数内部使用,而不是外部。或者作为参数传递,或者使用$GLOBALS['second_array']

标签: php globals


【解决方案1】:

正如大家所建议的那样,您应该将数组作为函数参数传递。在大多数情况下,使用全局变量是一种不好的做法。

            function operatii($second_array, $v) {
                $var1 = $second_array[count($second_array)-1];
                $var2 = $second_array[count($second_array)-2];
                $rez = null;
                echo $var1 . $var2 . "este?";
            }

            $second_array = array();

            for ($i = 0; $i < count($a); $i++) {
                if ($a[$i] === "+" || $a[$i] === "-" || $a[$i] === "*" || $a[$i] === "/" ) {
                    operatii($second_array, $a[$i]);
                } else {
                    array_push($second_array, $a[$i]);
                }
            }

【讨论】:

    【解决方案2】:

    在 PHP 中有两种方法可以引用全局变量:

    1. 在每个使用该变量的函数的开头使用 global 关键字。
    2. 使用$GLOBALS 数组。

    其中,我建议坚持使用第二个,因为它始终清楚地表明该变量是全局变量。

    全局变量的一个问题是跟踪它们的使用位置;使用$GLOBALS 数组在一定程度上缓解了这个问题。

    但是,使用全局变量仍然存在问题;在代码中使用太多全局变量通常被认为是不好的做法。在使用过大量广泛使用全局变量的遗留系统后,我可以保证它们会给未来的开发人员带来很多麻烦。

    使用全局变量还使得为您的代码编写正式的测试套件(即单元测试)变得更加困难。

    因此,我的建议是尽可能避免使用全局变量。在某些情况下它们是必要的,但您越能避免它们,而是将变量传递给您的函数和类而不是使它们成为全局变量,事情就会变得更好。

    总结一下:

    如果您必须使用全局变量,请使用 $GLOBALS['varname'] 引用它们,但通常最好不要使用它们。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      对于在谷歌搜索中遇到这个老问题的其他人,

      在示例中,变量 $second_array 被声明为全局变量,而不是在下一行中创建的数组。为了避免这种情况确保全局声明在数组声明之后。我的偏好是将全局声明放在函数本身中。

      $second_array = array();
      
      function operatii($v) {
      
          global $second_array;  
      
          $var1 = $second_array[count($second_array)-1];
          $var2 = $second_array[count($second_array)-2];
          $rez = null;
      
          echo $var1 . $var2 . "este?";
      }
      
      for ($i = 0; $i < count($a); $i++){
          if ($a[$i] === "+" || $a[$i] === "-" || $a[$i] === "*" || $a[$i] === "/" ) {
              operatii($a[$i]);
          } else {
              array_push($second_array, $a[$i]);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多