web-dev-qa-db-ja.com

PHP foreachループ内で宣言された変数は破棄され、各反復で再作成されますか?

次のようなforeachループ内で変数を宣言するとします。

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

PHPはそれを破棄し、反復ごとに再作成しますか?言い換えると、パフォーマンスの面で次のことを行う方が賢明でしょうか。

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

洞察をよろしくお願いします。

14

最初の例では:

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

_$myVariable_は最初の反復中に作成され、それ以降の反復ごとに上書きされます。スクリプト、関数、メソッドなどのスコープを離れる前に、いつでも破棄されることはありません...

2番目の例では:

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

_$myVariable_は反復の前に作成され、nullに設定されます。各反復中にifが上書きされます。スクリプト、関数、メソッドなどのスコープを離れる前に、いつでも破棄されることはありません...

更新

主な違いについては触れませんでした。 _$myArray_が空の場合(count($myArray) === 0)_$myVariable_は、最初の例ではnot作成されますが、2番目の例では値がnullになります。

21
eisberg

最初の例の私のIDE(NuSphere PHPed)のデバッガーによると:

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

$myVariableは一度だけ作成されます。

2
Jeremy1026

私の実験によると、それは同じです:

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

2
user4035

問題は、$ myVariableがforeachだけに真にローカルではないことです。したがって、同じ名前でグローバル変数を壊す可能性があります。

それを回避する方法は、foreachをインライン匿名関数にすることです。

例えば。

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

このようにして、他のグローバルを踏まないことを保証します。

0
user603749