次のようなforeachループ内で変数を宣言するとします。
foreach($myArray as $myData) {
$myVariable = 'x';
}
PHPはそれを破棄し、反復ごとに再作成しますか?言い換えると、パフォーマンスの面で次のことを行う方が賢明でしょうか。
$myVariable;
foreach($myArray as $myData) {
$myVariable = 'x';
}
洞察をよろしくお願いします。
最初の例では:
_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になります。
最初の例の私の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.
このようにして、他のグローバルを踏まないことを保証します。