在每个迭代中销毁并重新创建在foreach循环内声明的PHP变量吗?

时间:2012-11-29 13:23:28

标签: php variables loops foreach scope

如果我在foreach循环中声明一个变量,例如:

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

PHP会破坏它,并在每次迭代时重新创建它吗?换句话说,这样做会更明智:

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

提前感谢您的见解。

4 个答案:

答案 0 :(得分:19)

在你的第一个例子中:

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

$myVariable在第一次迭代期间创建,而不是在每次进一步迭代时覆盖。在离开脚本,函数,方法......的范围之前,它不会被销毁。

在你的第二个例子中:

$myVariable;
foreach($myArray as $myData) {
    $myVariable = 'x';
}
在任何迭代之前创建

$myVariable并将其设置为null。在每次迭代期间,如果将被覆盖。在离开脚本,函数,方法......的范围之前,它不会被销毁。

更新

我错过了提到的主要区别。如果$myArray为空(count($myArray) === 0$myVariable将在您的第一个示例中创建而不是,但在您的第二个示例中,它将使用null值。

答案 1 :(得分:2)

根据我的IDE(NuSphere PHPed)中的调试器,在你的第一个例子中:

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

$myVariable仅创建一次。

答案 2 :(得分:2)

根据我的实验,它是一样的:

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

print:int(2)

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

print:int(2)

答案 3 :(得分:0)

问题是$ myVariable不仅仅是foreach本地的。所以它可以破坏同名的全局变量。

解决这个问题的方法是让你的foreach成为内联匿名函数。

E.g。

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

这样你就可以保证它不会踩到其他全局变量。