如果我在foreach循环中声明一个变量,例如:
foreach($myArray as $myData) {
$myVariable = 'x';
}
PHP会破坏它,并在每次迭代时重新创建它吗?换句话说,这样做会更明智:
$myVariable;
foreach($myArray as $myData) {
$myVariable = 'x';
}
提前感谢您的见解。
答案 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.
这样你就可以保证它不会踩到其他全局变量。