首頁  >  文章  >  後端開發  >  帶大家了解PHP弱引用的知識

帶大家了解PHP弱引用的知識

藏色散人
藏色散人轉載
2021-05-11 12:00:002843瀏覽

本篇文章跟大家介紹一下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 保存的是物件符號表的參考。當我們 unset() 掉 $obj 時,$weakref 依然能夠正常使用。也就是說,$weakref 對 $obj 原始物件的記憶體參考依然保持著。不管我們怎麼 unset() 原始的 $obj ,都只是切斷了 $obj 的引用符號表,對真正的對象沒有影響,垃圾回收器也不會徹底的回收最最原始的 $obj 對象內容。

第二個物件我們使用的是 WeakReference 的 create() 方法來建立的弱引用,當我們銷毀 $obj1 後,$weakref 也會變成 NULL 。這就是弱引用的作用!

它可以讓垃圾回收器正常的回收,它可以避免循環引用帶來的記憶體洩漏問題,它能讓引用表現為類似於 C 中的指標操作。

最後一段程式碼是我們透過 WeakReference::create() 直接使用 new 來建立物件。這種形式是不行的,會一直回傳 NULL 。因為弱引用是透過變數來創建的,它指向的是原始物件的符號表,而變數和物件之間的符號表連接才是弱引用關心的內容,它會根據符號表的狀態來判斷當前的狀態。如果原始物件變數切斷了與符號表的連接,那麼弱引用的變數也會同步切斷,這樣,垃圾回收器就能正常的清理這個已經沒有任何引用計數的物件了。

注意

這裡要注意的是,上面的測試程式碼必須在 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中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除