今天就跟大家聊聊有關(guān)PHP中怎么實現(xiàn)弱引用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)公司專注于加查網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供加查營銷型網(wǎng)站建設(shè),加查網(wǎng)站制作、加查網(wǎng)頁設(shè)計、加查網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造加查網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供加查網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
弱引用允許程序員保留對對象的引用,而該對象不會阻止對象被銷毀;它們對于實現(xiàn)類似緩存的結(jié)構(gòu)非常有用。
這是比較官方的解釋。從這個說明中,我們可以看出,弱引用也是一種引用形式,但是,如果我們銷毀了原來的對象,那么弱引用對象也會被銷毀,就像普通的值對象賦值一樣。如果沒有看過之前的文章,或者對 PHP 中的引用不太熟悉的朋友可能需要再了解一下 PHP 中引用相關(guān)的知識。下面,我們直接通過示例來看一下。
$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ù)的對象了。
看完上述內(nèi)容,你們對PHP中怎么實現(xiàn)弱引用有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。