php7引用计数,PHP7 引用计数 读书笔记
PHP7 引用計數 讀書筆記
每個 PHP 變量存在一個加 "zval" 的變量容器中. 一個 zval 變量容器, 除了包含變量的類型和值, 還包括兩個字節的額外信息.
1.is_ref : 是一個 bool 值, 用來標識這個變量是否屬于引用集合. 通過這個字節, PHP 引擎才能把普通變量和引用變量區分開來, 由于 PHP 允許用戶通過 & 來自定義引用, zval 變量容器中還有一個內部引用計數機制, 來優化內存使用.
2.refcount, 用來表示指向這個 zval 變量容器的變量 (也稱為符號 symbol) 個數. 所有的符號存在一個符號表中, 其中每個符號都有作用域, 那些主腳本和每個函數或者方法也都有作用域.
接下來我們通過幾個例子來幫助大家理解.(以下代碼是在 Linux+php7.1 環境下)
1. 生成一個新的 zval 容器<?PHP
$a='new string';
xdebug_debug_zval('a');
輸出結果如下:
從結果可以看出 refount = 0,is_ref=0 那怎么理解這個輸出結果呢?
(1)is_ref = 0 信息很容易理解,$a 不是一個引用變量自然就是 0
(2)refount 的值怎么也是 0, 因為我們知道在 php7 中對于簡單的數據類型, 比如整型, 字符串, 浮點型等簡單類型的值是直接存儲在 zval 結構里面.
如果把變量 a 賦值給多個變量會怎樣?<?PHP
$a="new string";
$c=$b=$a;
xdebug_debug_zval('a');
輸出結果如下:
發現 refcount 的值還是 0, 三個變量共用 1 個 zval 結構, 沒有存符號表. 下面我們再給看下變量被引用后的情況:<?PHP
$a="new string";
$b=&$a;
$c=&$b;
xdebug_debug_zval('a');
xdebug_debug_zval('b');
xdebug_debug_zval('c');
輸出結果如下:
我們發現三個變量的 refount 和 is_ref 都相同, 那我們來解釋下:
1. 當變量被引用后, 原來的 zval 結構會發生變化, PHP 會新增一個_zend_reference 結構, 這個結構會根據值得類型不同而不同.struct_zend_reference{
zend_refcounted_h gc;
zval val;
}
我們來看下 PHP 的具體操作:
(1)PHP 會申請一個 zend_reference 結構
(2)將 zval_reference.value 指向原來的 zval_struct.value
(3)zval_struct.value 的數據類型修改為 zend_refrence
(4)將 zval_struct.value 指向剛剛申請并初始化的 zend_reference
(5)為新變量申請 zval_struct 結構, 將他的 value 指向剛剛創建的 zend_reference
來源: http://www.bubuko.com/infodetail-3382348.html
總結
以上是生活随笔為你收集整理的php7引用计数,PHP7 引用计数 读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tushare平台介绍
- 下一篇: php求数组交集的自定义函数,php数组