ホームページ > バックエンド開発 > PHPチュートリアル > PHP の弱参照の知識を誰もが理解できるようにする

PHP の弱参照の知識を誰もが理解できるようにする

藏色散人
リリース: 2023-04-10 06:02:01
転載
2894 人が閲覧しました

この記事では、PHP の弱参照に関する知識を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

前回の記事では、参照と値による参照に関する知識を学びました。 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 ビデオ チュートリアル

以上がPHP の弱参照の知識を誰もが理解できるようにするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート