ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルでの foreach および参照の使用によって引き起こされるプログラムのバグの問題の紹介

PHP_PHP チュートリアルでの foreach および参照の使用によって引き起こされるプログラムのバグの問題の紹介

WBOY
WBOYオリジナル
2016-07-21 15:16:40748ブラウズ

コードをコピーします コードは次のとおりです:

$a = array(1, 2);
$b = array(11, 12);
foreach($a as &$r){
}
foreach( $b as $r){
}
echo $a[1]; // 出力 12

2 つのループの本来の目的は次のとおりです。最初のループは、しかし、2 番目のループでは $r が一時変数として扱われるだけですが、なぜ $a[1] の値が変化するのでしょうか? $a の反復が完了すると、$r の値が変化します。 $a[1] 引用すると、$r の値を変更するということは、$a[1] を変更することを意味します。この時点では、$r が変更されておらず、$a[1] もコード内で変更されていないことに驚かれるかもしれません。実際、foreach は配列のコピーである操作であるため、後の反復は次と同等です:



コードをコピー
コードは次のとおりです: for($i=0; $i$r = $b[$i]; // $a[1] = $b[$i] と同等です
この状況を回避するには、最初の反復後に実行する必要があります



コードをコピーします

コードは次のとおりです:
unset($r); $r 変数 (参照変数) を現在の環境から削除します。
前の例でなくても、最初の反復ではその後、同様のステートメントを再度実行する可能性が非常に高くなります:


コードをコピーします

コードは次のとおりです:
$r = 123; ループ変数は通常、一時変数であり、同じ変数名がコード内の異なる場所で表されます。ただし、変数のスコープはループの外に存在します。これは、このスコープ ルールの欠点です。 「変数が宣言されずに使用される」という欠点に加えて、変数に型がないという欠点もあります
したがって、PHP で参照変数を使用する場合は、参照が使用された後にすべての変数を unset() する必要があります。 ) 使用前に。


http://www.bkjia.com/PHPjc/325872.html

www.bkjia.com

tru​​e

技術記事次のようにコードをコピーします: $a = array(1, 2); $b = array(11, 12); foreach($a as // 出力 12. 2 つのループの本来の目的は次のとおりです。ループに入るように要素の内容を変更します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。