PHP 弱引用的相關(guān)總結(jié)
之前的文章中,我們已經(jīng)學習過引用和引用傳值相關(guān)的知識。我們知道,PHP 中沒有純引用(指針),不管是對象,還是用引用符號 & 賦值的變量,都是對一個符號表的引用。而今天,我們要學習的是另一種引用形式:弱引用。
什么是弱引用
弱引用允許程序員保留對對象的引用,而該對象不會阻止對象被銷毀;它們對于實現(xiàn)類似緩存的結(jié)構(gòu)非常有用。
這是比較官方的解釋。從這個說明中,我們可以看出,弱引用也是一種引用形式,但是,如果我們銷毀了原來的對象,那么弱引用對象也會被銷毀,就像普通的值對象賦值一樣。如果沒有看過之前的文章,或者對 PHP 中的引用不太熟悉的朋友可能需要再了解一下 PHP 中引用相關(guān)的知識。下面,我們直接通過示例來看一下。
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 原始對象的內(nèi)存引用依然保持著。不管我們怎么 unset() 原始的 $obj ,都只是切斷了 $obj 的引用符號表,對真正的對象沒有影響,垃圾回收器也不會徹底的回收最最原始的 $obj 對象內(nèi)容。
第二個對象我們使用的是 WeakReference 的 create() 方法來創(chuàng)建的弱引用,當我們銷毀 $obj1 后,$weakref 也會變成 NULL 。這就是弱引用的作用!
它可以讓垃圾回收器正常的回收,它可以避免循環(huán)引用帶來的內(nèi)存泄漏問題,它能讓引用表現(xiàn)為類似于 C 中的指針操作一樣。
最后一段代碼是我們通過 WeakReference::create() 中直接使用 new 來創(chuàng)建對象。這種形式是不行的,會一直返回 NULL 。因為弱引用是通過變量來創(chuàng)建的,它指向的是原始對象的符號表,而變量和對象之間的符號表連接才是弱引用關(guān)心的內(nèi)容,它會根據(jù)符號表的狀態(tài)來判斷當前的狀態(tài)。如果原始對象變量切斷了與符號表的連接,那么弱引用的變量也會同步切斷,這樣,垃圾回收器就能正常的清理這個已經(jīng)沒有任何引用計數(shù)的對象了。
注意
這里需要注意的是,上面的測試代碼必須在 PHP7.4 及以上版本才有用,WeakReference 類是 PHP7.4 新增加的內(nèi)容。之前的版本需要安裝 WeakRef 這個擴展才能實現(xiàn)弱引用的能力,具體的內(nèi)容可以查閱下方鏈接中的相關(guān)的文檔。
測試代碼:
https://github.com/zhangyue0503...
以上就是PHP 弱引用的相關(guān)總結(jié)的詳細內(nèi)容,更多關(guān)于PHP 弱引用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP+FLASH實現(xiàn)上傳文件進度條相關(guān)文件 下載
PHP+FLASH實現(xiàn)上傳文件進度條相關(guān)文件 下載...2007-07-07PHP實現(xiàn)將多個文件壓縮成zip格式并下載到本地的方法示例
這篇文章主要介紹了PHP實現(xiàn)將多個文件壓縮成zip格式并下載到本地的方法,涉及php針對文件與目錄的讀寫、判斷與zip壓縮相關(guān)操作技巧,需要的朋友可以參考下2018-05-05PHP實現(xiàn)移除數(shù)組中為空或為某值元素的方法
這篇文章主要介紹了PHP實現(xiàn)移除數(shù)組中為空或為某值元素的方法,涉及php使用array_filter過濾數(shù)組的相關(guān)操作技巧,需要的朋友可以參考下2017-01-01php中轉(zhuǎn)義mysql語句的實現(xiàn)代碼
如果你需要向數(shù)據(jù)庫,插入形如’你好’,這樣包含有單引號或者雙引號的字符串怎么辦,當然可以使用反斜杠進行轉(zhuǎn)義,但是如果內(nèi)容太多呢?2011-06-06php基于mcrypt_encrypt和mcrypt_decrypt實現(xiàn)字符串加密解密的方法
這篇文章主要介紹了php基于mcrypt_encrypt和mcrypt_decrypt實現(xiàn)字符串加密解密的方法,結(jié)合實例形式分析了mcrypt_encrypt和mcrypt_decrypt函數(shù)進行加密、解密的相關(guān)使用技巧,需要的朋友可以參考下2016-07-07PHP得到mssql的存儲過程的輸出參數(shù)功能實現(xiàn)
在開發(fā)過程中可能會遇到無法取得MSSQL存儲過程的輸出參數(shù),很多朋友都不知道該怎么辦,本文將詳細介紹PHP得到mssql的存儲過程的輸出參數(shù)功能實現(xiàn)2012-11-11探討file_get_contents與curl效率及穩(wěn)定性的分析
本篇文章是對file_get_contents與curl效率及穩(wěn)定性進行了詳細的分析介紹,需要的朋友參考下2013-06-06