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

Если я объявляю переменную внутри цикла 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. 

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