Переменные PHP, объявленные внутри цикла foreach, уничтожены и воссозданы на каждой итерации?
Если я объявляю переменную внутри цикла foreach, например:
foreach($myArray as $myData) {
$myVariable = 'x';
}
Развертывает ли PHP его и воссоздает его на каждой итерации? Другими словами, было бы разумнее выполнить следующие действия:
$myVariable;
foreach($myArray as $myData) {
$myVariable = 'x';
}
Заранее благодарим за понимание.
Ответы
Ответ 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.
Таким образом вы гарантируете, что он не будет наступать на другие глобальные переменные.