最近 PHP のリファレンス カウンター部分を調べましたが、最初はさまざまな混乱があって混乱しました。その後、ブログを読んで分析した後、よく覚えておくのに役立つ、比較的一般的な説明をまとめました。すべての読者にも役立ちます。ここでのブログ投稿の共有は、よりオーソドックスな説明です: PHP 変数リファレンス (http://hilojack.sinaapp.com/?p=1392)。
PHP 参照カウンターの変更を調べるには、Xdebug 拡張機能をインストールした後、xdebug_debug_zval('var') を直接呼び出して変数 $var の参照カウンターを確認します。
参照カウンターについて話すには、PHP の変数のストレージと参照カウントのメカニズムを理解する必要があります。もちろん、参照カウントによりメモリが節約され、複数の変数シンボルがメモリ値空間 (変数コンテナとも呼ばれます) を共有できるようになります。参照カウントが変更されるタイミング: 割り当て。 割り当てには、値による転送と参照による割り当ての 2 種類があります。さらに理解しにくいのは、参照の割り当てです。参照カウントのもう 1 つの機能は、同じスペースを共有できる場合と、変数を分離する必要がある (新しいスペースが開かれる) 場合を示すことです。
理解と記憶を促進するために、課題のさまざまなシナリオについて一般的な説明をしていますが、実際の状況とは一致しません。
& 記号はcombination で、これは結婚に相当しますが、PHP では複数の人が一緒に結婚する (つまり、一夫多妻制または一夫多妻制) ことが許可されており、これは非常に異常です。 注意: 結婚するには同棲する必要があります。別居は認められません。結婚の他にシェアハウスという形態もあります。共有も一緒に住むことですが、関係はありません。複数人が一緒に住むことを許可するのは合理的で合理的です。もちろん、もっとわかりやすい別の状況として、一人暮らしがあります。次の例は、代入ステートメントとこれら 3 つの状態の間の対応を示しています。 シナリオ 1:
シナリオ 2:$a = "a"; // $a 独居, is_ref = 0, refcount = 1; $b = $a; // $a 与 $b 合租, is_ref = 0, refcount = 2;
代入中の変数変化関係の分析を始めましょう:
シナリオ 1:
れーれーシナリオ 2:
シナリオ 3:
シナリオ 4:
シナリオ 5:
シナリオ 6:
シナリオ 7:
シナリオ 8:
上記は、自己参照の状況を除いた、単純な変数代入のさまざまな状況を分析しています。要約すれば:
単純な代入は、等号の左側にある変数の is_ref を確認する必要があります (つまり、is_ref = 1 の場合は値をコピーします)。それ以外の場合は、 の左側を考慮します。追加のメモリを割り当てずに左側の変数で取得できるかどうかを確認するための順序です。このとき、右側の変数が同じ記憶領域を共有しているかどうかを確認する必要があります。その場合、それらは一緒に住むことができず、右側の変数も単一である場合、それらはすべて COW (copy-on-write) 原則に従って同じメモリを共有します。
参照代入は、まず右側の変数の参照状態を確認する必要があります。 is_ref = 1 の場合、右側が参照されていない場合は、直接 refcount ++ します。 (is_ref = 0)、右側の人が一人暮らしかどうかを確認する必要があります。そうであれば、左右の 2 つの変数は右側の変数空間を共有します。そうでない場合は、右側の変数が元の場所から分離され、左側に新しいスペースが開きます。 参照代入である限り、左側の変数は、以前に結合または共有された変数から常に分離されている必要があります。
http://www.bkjia.com/PHPjc/875473.html