php垃圾回收機制範例介紹

2020-07-16 10:05:50

<?php
$a = "new string";
?>

在上例中,新的變數a,是在當前作用域中生成的。並且生成了型別為 string 和值為new string的變數容器。在額外的兩個位元組資訊中,"is_ref"被預設設定為 FALSE,因為沒有任何自定義的參照生成。

"refcount" 被設定為 1,因為這裡只有一個變數使用這個變數容器. 注意到當"refcount"的值是1時,"is_ref"的值總是FALSE. 如果你已經安裝了? Xdebug,你能通過呼叫函數 xdebug_debug_zval()顯示"refcount"和"is_ref"的值。

Example #2 顯示zval資訊

<?php
xdebug_debug_zval('a');
?>

以上例程會輸出:

a: (refcount=1, is_ref=0)='new string'

把一個變數賦值給另一變數將增加參照次數(refcount).

Example #3 增加一個zval的參照計數

<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
?>

以上例程會輸出:

a: (refcount=2, is_ref=0)='new string'

這時,參照次數是2,因為同一個變數容器被變數 a 和變數 b關聯.當沒必要時,php不會去複製已生成的變數容器。

變數容器在」refcount「變成0時就被銷毀. 當任何關聯到某個變數容器的變數離開它的作用域(比如:函數執行結束),或者對變數呼叫了函數 unset()時,」refcount「就會減1,下面的例子就能說明:

Example #4 減少參照計數

<?php
$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );
unset( $b, $c );
xdebug_debug_zval( 'a' );
?>

以上例程會輸出:

a: (refcount=3, is_ref=0)='new string'
a: (refcount=1, is_ref=0)='new string'

如果我們現在執行 unset($a);,包含型別和值的這個變數容器就會從記憶體中刪除。

相關推薦:

PHP視訊教學:https://www.php.cn/course/list/29/type/2.html

以上就是php垃圾回收機制範例介紹的詳細內容,更多請關注TW511.COM其它相關文章!