Если я объявляю переменную внутри цикла foreach, например:
foreach($myArray as $myData) { $myVariable = 'x'; }
Развертывает ли PHP его и воссоздает его на каждой итерации? Другими словами, было бы разумнее сделать это:
$myVariable; foreach($myArray as $myData) { $myVariable = 'x'; }
Заранее благодарю вас за ваши идеи.
В первом примере:
foreach($myArray as $myData) { $myVariable = 'x'; }
$myVariable
создается во время первой итерации и перезаписывается на каждой последующей итерации. Он не будет уничтожен в любое время, прежде чем покинуть сферу действия вашего скрипта, функции, метода, …
Во втором примере:
$myVariable; foreach($myArray as $myData) { $myVariable = 'x'; }
$myVariable
создается до любой итерации и имеет значение null. Во время каждой итерации, если она будет перезаписана. Он не будет уничтожен в любое время, прежде чем покинуть сферу действия вашего скрипта, функции, метода, …
Я пропустил упоминание о главном отличии. Если $myArray
пуст ( count($myArray) === 0
) $myVariable
не будет создан в вашем первом примере, но во втором он будет иметь значение null.
Согласно отладчику в моей среде IDE (NuSphere PHPed) в вашем первом примере:
foreach($myArray as $myData) { $myVariable = 'x'; }
$myVariable
создается только один раз.
Согласно моему эксперименту, это одно и то же:
<?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)
Проблема заключается в том, что $ myVariable не является действительно локальным только для foreach. Таким образом, он может сжимать глобальную переменную под тем же именем.
Способ вокруг этого – сделать ваш foreach встроенной анонимной функцией.
Например
$myforeach=function(&$myArray){ // pass by ref only if modifying it foreach($myArray as $myData) { $myVariable = 'x'; } }; $myforeach($myArray); // execute anonymous.
Таким образом вы гарантируете, что он не будет действовать на другие глобальные переменные.