前回の記事では、参照と値による参照に関する知識を学びました。 PHP には純粋な参照 (ポインタ) が存在しないことがわかっていますが、それがオブジェクトであっても、参照記号 & が割り当てられた変数であっても、それはシンボル テーブルへの参照です。今日は、別の形式の参照である弱参照について学びます。
弱参照とは
弱参照を使用すると、プログラマはオブジェクトの破壊を防ぐことなくオブジェクトへの参照を保持できます。キャッシュのような構造を実装するのに役立ちます。
これはより正式な説明です。この説明から、弱参照も参照の一種であることがわかりますが、元のオブジェクトを破棄すると、通常の値オブジェクトの代入と同様に、弱参照オブジェクトも破棄されます。前回の記事を読んでいない場合、または PHP の参照に慣れていない場合は、PHP の参照についてさらに学ぶ必要があるかもしれません。以下では、例を直接見てみましょう。
WeakReference
$obj = new stdClass; $weakref = $obj; var_dump($weakref); // object(stdClass)#1 (0) { // } unset($obj); var_dump($weakref); // object(stdClass)#1 (0) { // } $obj1 = new stdClass; $weakref = WeakReference::create($obj1); var_dump($weakref->get()); // object(stdClass)#2 (0) { // } unset($obj1); var_dump($weakref->get()); // NULL $weakref = WeakReference::create(new stdClass); var_dump($weakref->get()); // NULL
最初のオブジェクト \$obj では、直接代入参照が実行されます。これは、PHP のデフォルトのオブジェクト代入です。このとき、$weakrefはオブジェクトシンボルテーブルへの参照を保持します。 $obj を unset() しても、$weakref は通常どおり使用できます。言い換えれば、$weakref の元のオブジェクト $obj へのメモリ参照はまだ残っています。元の $obj をどのように unset() しても、$obj の参照シンボル テーブルが切り取られるだけで、実際のオブジェクトには影響しません。ガベージ コレクターは元の $obj オブジェクトの内容を完全にはリサイクルしません。
2 番目のオブジェクトでは、WeakReference の create() メソッドを使用して弱参照を作成します。$obj1 を破棄すると、$weakref も NULL になります。これが弱参照の目的です。
これにより、ガベージ コレクターが正常にリサイクルできるようになり、循環参照によって引き起こされるメモリ リークを回避でき、参照を C のポインター操作と同様に動作させることができます。
コードの最後の部分は、WeakReference::create() で new を直接使用してオブジェクトを作成します。この形式は不可能であり、常に NULL を返します。弱参照は変数を介して作成されるため、元のオブジェクトのシンボル テーブルを指し、変数とオブジェクトの間のシンボル テーブルの接続が弱参照によって考慮され、ステータスに基づいて現在の状態を判断します。シンボルテーブルの。元のオブジェクト変数がシンボル テーブルから切り離されると、弱参照変数も同期的に切り離されるため、ガベージ コレクターは通常、参照カウントを持たなくなったオブジェクトをクリーンアップできます。
Note
上記のテスト コードは PHP7.4 以降で使用する必要があることに注意してください。WeakReference クラスは PHP7.4 に新しく追加されたクラスです。以前のバージョンでは、弱参照機能を実装するには WeakRef 拡張機能をインストールする必要がありました。具体的な内容については、以下のリンクにある関連ドキュメントを参照してください。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%AD%A6%E4%B9%A0PHP%E5%BC%B1%E5%BC%95%E7%94%A8%E7%9A%84%E7%9F%A5%E8%AF%86.php
推奨学習: 「PHP ビデオ チュートリアル 」