14

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

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

PHP 是否会销毁它,并在每次迭代时重新创建它?换句话说,这样做在性能方面是否更聪明:

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

提前感谢您的见解。

4

4 回答 4

22

在您的第一个示例中:

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

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

在您的第二个示例中:

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

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

更新

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

于 2012-11-29T13:27:13.217 回答
2

根据您的第一个示例中我的 IDE (NuSphere PHPed) 中的调试器:

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

$myVariable只创建一次。

于 2012-11-29T13:28:49.327 回答
2

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

<?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)

于 2012-11-29T13:32:07.203 回答
0

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

一种解决方法是让你的 foreach 成为一个内联匿名函数。

例如

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

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

于 2017-09-26T19:28:00.303 回答