天天看點

為什麼PHP7中數組初始化後,refcount=2

php版本 7.2

$empty = [];
xdebug_debug_zval('empty');      

輸出:

empty: (refcount=2, is_ref=0)=array ()

這牽扯到 PHP7 中的另一個概念,叫做 immutable array (不可變數組),在不可變數組下,使用一個僞計數值2。類型是這種直接申明規定數組

array(1,2,3)的refcount = 2 你可以看下 array("time"=>time())這樣的申明,就是1。

摘抄一段PHP7數組開發成員的一段原話,你可以看看。

For arrays the not-refcounted variant is called an "immutable array". If you use opcache, then constant array literals in your code will be converted into immutable arrays. Once again, these live in shared memory and as such must not use refcounting. Immutable arrays have a dummy refcount of 2, as it allows us to optimize certain separation paths.

一. 為什麼某些變量的引用計數器的初始值為 0

$var_int = 233;  
$var_float = 233.3;  
$var_str = '233';  
xdebug_debug_zval('var_int');  
xdebug_debug_zval('var_float');  
xdebug_debug_zval('var_str');  
/** 輸出 ** 
var_int: (refcount=0, is_ref=0)=233
var_float: (refcount=0, is_ref=0)=233.3
var_str: (refcount=1, is_ref=0)='233'
**********/      

原因

在 PHP7 中,為一個變量指派的時候,包含了兩部分操作:

  1. 為符号量(即變量名)申請一個 zval_struct結構
  2. 将變量的值儲存到 zval_struct.value中 對于 zval 在 value 字段中能儲存下的值,就不會在對他們進行引用計數, 而是在拷貝的時候直接指派 ,這部分類型有:
  • IS_LONG
  • IS_DOUBLE

即我們在 PHP 中的 整形 與 浮點型 。

對于xdebug_debug_zval('var_str');  不同php版本輸出有點差别:

PHP 7.2.24