如果我在 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。在每次迭代期间,如果将被覆盖。在离开脚本、函数、方法的范围之前,它不会在任何时候被销毁,...
我错过了提到主要区别。If $myArray
is empty ( 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);
打印:int(2)
<?php
$myVariable;
for($i = 0; $i < 3; $i++) {
$myVariable = $i;
}
var_dump($myVariable);
打印: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.
这样你就可以保证它不会踩到其他全局变量。