web-dev-qa-db-ja.com

グローバル配列の宣言

こんにちは。私は最近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関数では使用できません。
この問題を解決するにはどうすればよいですか?

15

PHPでグローバル変数を参照するには、2つの方法があります。

  1. 変数を使用するすべての関数の先頭でglobalキーワードを使用します。
  2. $GLOBALS配列を使用します。

これらの中で、変数がグローバルであることを常に絶対に明確にするので、2番目に固執することをお勧めします。

グローバルの問題の1つは、グローバルが使用されている場所を追跡することです。 $GLOBALS配列を使用すると、この問題をある程度緩和できます。

ただし、グローバルの使用にはまだ問題があります。コード内でグローバルを使用しすぎることは、一般的に悪い習慣だと考えられています。グローバルを広範囲に使用する多くのレガシーシステムと連携して、将来の開発者に多くの頭痛の種を引き起こす可能性があるという事実を保証できます。

グローバルを使用すると、コードの正式なテストスイート(ユニットテストなど)の作成も難しくなります。

したがって、可能な限りグローバルを使用しないことをお勧めします。それらは場合によっては必要ですが、それらを回避し、変数をグローバルにするのではなく関数やクラスに渡すほど、より良いものになります。

要約すると:

グローバルを使用する必要がある場合は、$GLOBALS['varname']を使用してそれらを参照しますが、通常はまったく使用しないことをお勧めします。

お役に立てば幸いです。

18
Spudley

誰もが提案したように、関数パラメーターとして配列を渡す必要があります。グローバルを使用することは、主要な場合には悪い習慣です。

            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]);
                }
            }
6
Alain Tiemblo

グーグル検索でこの古い質問をしている人のために

この例では、変数$ 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]);
    }
}
3
Neil Richins