Объявление глобального массива

Привет. Недавно я изучил PHP и пытаюсь объявить глобальный массив, чтобы я мог получить доступ к функции. Но мне кажется, что что-то не хватает, потому что я получаю ошибку 'Undefined variable:'

Вот мой код:

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

Кажется, я могу использовать $second_array в цикле for, но не могу использовать его в функции operatii.
Как я могу решить эту проблему?

Ответ 1

Существует два способа ссылки на глобальную переменную в PHP:

  • Используйте ключевое слово global в начале каждой функции, использующей переменную.
  • Используйте массив $GLOBALS.

Из них я рекомендую придерживаться второго, так как это абсолютно ясно, что переменная является глобальной.

Одна из проблем с глобалями - отслеживать, где они используются; использование массива $GLOBALS в некоторой степени смягчает эту проблему.

Однако все еще существуют проблемы с использованием глобальных переменных; обычно считается, что плохая практика использует слишком много глобальных символов в вашем коде. Работая с рядом устаревших систем, которые широко использовали глобальные переменные, я могу ручаться за то, что они могут вызвать много головных болей для будущих разработчиков.

Использование глобалов также затрудняет запись формальных наборов тестов для вашего кода (например, модульные тесты).

Поэтому моя рекомендация состояла бы в том, чтобы избежать использования глобальных переменных, где это возможно. В некоторых случаях они необходимы, но чем больше вы их избегаете, тем лучше передаете переменные в свои функции и классы, а не делаете их глобальными, тем лучше.

Итак, суммируем:

Если вы должны использовать глобальные переменные, обратитесь к ним с помощью $GLOBALS['varname'], но обычно лучше не использовать их вообще.

Надеюсь, что это поможет.

Ответ 2

Как и все предлагаемые, вы должны передать свой массив как параметр функции. Использование глобальных переменных является плохой практикой в ​​основных случаях.

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

Ответ 3

Чтобы кто-то еще ударил этот старый вопрос в поиске Google,

В примере переменная $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]);
    }
}