ホームページ > php教程 > php手册 > PHP での foreach と参照の使用によって引き起こされるプログラムのバグの問題についての紹介

PHP での foreach と参照の使用によって引き起こされるプログラムのバグの問題についての紹介

WBOY
リリース: 2016-06-13 11:58:25
オリジナル
1701 人が閲覧しました

コードをコピー コードは次のとおりです。


$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 は動作します。配列のコピー上で実行されるため、1 回の反復は以下と同等になります:

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


>for($i=0; $i$r = $b[$i]; // $a[1] = $b と同等です! [$i];
}


この状況を回避するには、

Copy code を実行する必要があります。最初の反復のコードは次のとおりです:


unset($r);


現在の環境から $r 変数 (参照変数) を削除します。
前の例ではない場合でも、最初の反復の後、同様のステートメントを再度実行する可能性は十分にあります。

コードをコピー コード

$r = 123;

ループ変数は通常、コード内の異なる場所では異なるものを表します。変数のスコープはループの外に存在します。これがこのスコープ ルールの欠点であり、さらに「変数を宣言せずに使用できる」という欠点に加えて、変数には型がないという欠点もあります。 🎜>そのため、PHP で参照変数を使用する場合は、参照が使用された後でそれらを unset() する必要があります。使用する前に unset() する必要があります。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート