Подтвердить что ты не робот

Переменные PHP, объявленные внутри цикла foreach, уничтожены и воссозданы на каждой итерации?

Если я объявляю переменную внутри цикла foreach, например:

foreach($myArray as $myData) {
    $myVariable = 'x';
}

Развертывает ли PHP его и воссоздает его на каждой итерации? Другими словами, было бы разумнее выполнить следующие действия:

$myVariable;
foreach($myArray as $myData) {
    $myVariable = 'x';
}

Заранее благодарим за понимание.

4b9b3361

Ответ 1

В первом примере:

foreach($myArray as $myData) {
    $myVariable = 'x';
}

$myVariable создается во время первой итерации и перезаписывается на каждой последующей итерации. Он не будет уничтожен в любое время, прежде чем покинуть область вашего script, функции, метода,...

В вашем втором примере:

$myVariable;
foreach($myArray as $myData) {
    $myVariable = 'x';
}

$myVariable создается до любой итерации и устанавливается в null. Во время каждой итерации, если она будет перезаписана. Он не будет уничтожен в любое время, прежде чем покинуть область вашего script, функции, метода,...

Update

Я пропустил упоминание о главном отличии. Если $myArray пуст (count($myArray) === 0) $myVariable будет создан не в первом примере, но в секунду он будет иметь значение null.

Ответ 2

В соответствии с отладчиком в моей среде IDE (NuSphere PHPed) в вашем первом примере:

foreach($myArray as $myData) {
    $myVariable = 'x';
}

$myVariable создается только один раз.

Ответ 3

Согласно моему эксперименту, это то же самое:

<?php
for($i = 0; $i < 3; $i++) {
    $myVariable = $i;
}
var_dump($myVariable);

prints: int (2)

<?php
$myVariable;
for($i = 0; $i < 3; $i++) {
    $myVariable = $i;
}
var_dump($myVariable);

prints: int (2)

Ответ 4

Проблема заключается в том, что $myVariable не является действительно локальным только для foreach. Таким образом, он может группировать глобальную переменную под тем же именем.

Поворот вокруг делает вашу foreach встроенной анонимной функцией.

например.

$myforeach=function(&$myArray){ // pass by ref only if modifying it
  foreach($myArray as $myData) {
    $myVariable = 'x';
  }
};
$myforeach($myArray);  // execute anonymous.

Таким образом вы гарантируете, что он не будет наступать на другие глобальные переменные.