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

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

Jun 13, 2016 am 11:58 AM
arraybugforeachphp導入コード使用そしてコピーに導く引用プログラム質問

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


$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() する必要があります。
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール