php 什么时候销毁对象,什么决定什么时候在PHP中销毁类对象?
在PHP中,所有值都保存在所謂的zvals中.這些zvals包含實際的數據,類型信息,這對您的問題很重要 – 引用計數.看看下面的代碼段:
$a = new B; // $a points to zval(new B) with refcount=1
$b = $a; // $a, $b point to zval(new B) with refcount=2 (+1)
$c = $b; // $a, $b, $c point to zval(new B) with refcount=3 (+1)
unset($a); // $b, $c point to zval(new B) with refcount=2 (-1)
一旦引用計數到達0,zval將被釋放并且對象析構函數被調用.
以下是refcount達到0的示例:
>改變一個變量:
$a = new B; // refcount=1
unset($a); // refcount=0 => __destruct!
但:
$a = new B; // refcount=1
$b = $a; // refcount=2
unset($a); // refcount=1 => no destruct as refcount > 0, even though unset() was called!
>離開函數(或方法)范圍
function a() {
$a = new B; // refcount=1
} // refcount=0 => __destruct! (as $a does not exist anymore)
>腳本執行結束
$a = new B; // refcount=1
die(); // refcount=0 => __destruct! (on script execution end all vars are freed)
// doesn't need to be die(), can be just normal execution end
這些顯然并不是所有的條件導致了refcount的減少,而是你最常見的那些.
還應該提到,因為PHP 5.3循環引用也會被檢測到.因此,如果對象$a引用對象$b和$b引用$a,并且沒有任何進一步引用$a或$b,則兩者的引用將為1,但它們仍將被釋放(和__destructed).在這種情況下,盡管破壞的順序是未定義的行為.
總結
以上是生活随笔為你收集整理的php 什么时候销毁对象,什么决定什么时候在PHP中销毁类对象?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 七牛云fetch,七牛云调用类
- 下一篇: docker安装mysql8,Docke