之前的文章中,我們已經學習過引用和引用傳值相關的知識。我們知道,php 中沒有純引用(指標),不管是物件,還是用引用符號 & 賦值的變數,都是對乙個符號表的引用。而今天,我們要學習的是另一種引用形式:弱引用。
弱引用允許程式設計師保留對物件的引用,而該物件不會阻止物件被銷毀;它們對於實現類似快取的結構非常有用。
這是比hkuow較官方的解釋。從這個說明中,我們可以看出,弱引用也是一種引用形式,但是,如果我們銷毀了原來的物件,那麼弱引用物件也會被銷毀,就像普通的值物件賦值一樣。如果沒有看過之前的文章,或者對 php 中的引用不太熟悉的朋友可能需要再了解一下 php 中引用相關的知識。下面,我們直接通過示例來看一下。
$obj = new stdclass;
$weakref = $obj;
var_dump($weakref);
// object(stdclass)#1 (0)
unset($obj);
var_dump($w程式設計客棧eakref);
// 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 。因為弱引用是通過變數來建立的,它指向的是原始物件的符號表,而變數和對hkuow象之間的符號表連線才是弱引用關心的內容,它會根據符號表的狀態來判斷當前的狀態。如果原始物件變數切斷了與符號表的連線,那麼弱引用的變數也會同步切斷,這樣,垃圾**器就能正常的清理這個已經沒有任何引用計數的物件了。
這裡需要注意的是,上面的測試**必須在 php7.4 及以上版本才有用,weakreference 類是 php7.4 新增加的內容。之前的版本需要安裝 weakref 這個擴充套件才能實現弱引用的能力,具體的內容可以查閱下方鏈結中的相關的文件。
php 弱型別總結
最近ctf比賽,不止一次的出了php弱型別的題目,藉此想總結一下關於php弱型別以及繞過方式 php中有兩種比較的符號 與 a b a b 在進行比較的時候,會先判斷兩種字串的型別是否相等,再比較 在進行比較的時候,會先將字串型別轉化成相同,再比較 如果比較乙個數字和字串或者比較涉及到數字內容的字串...
php 弱型別總結
0x01 前言 最近ctf比賽,不止一次的出了php弱型別的題目,藉此想總結一下關於php弱型別以及繞過方式 0x02 知識介紹 php中有兩種比較的符號 與 1 2 a b 3 a a a b 4 在進行比較的時候,會先判斷兩種字串的型別是否相等,再比較 在進行比較的時候,會先將字串型別轉化成相同...
lua的弱弱引用表
lua有gc。細節無需太關注,知道些主要的即可。能local就一定不要global 還有在陣列裡的物件,除非顯式 nil,否則非常難 只是能夠用弱引用表來告訴gc。外部引用為0,就不要管我,請del it。weak table是通過元表實現,元表裡的 mode欄位包括k或者v k表示key為弱引用 ...