xdebug_debug_zval関数の結果の理由を教えてください。
Q&A
Closed
refcount=0
となる理由がわからない
PHP8にて、xdebug_debug_zval
関数を使って、リファレンスカウントの原理を確認しています。
以下のコード
$i = 1;
xdebug_debug_zval('i');
を実行した結果が
i: (refcount=0, is_ref=0)=1
となる、特に refcount=0 となる理由を教えてください。
自分の考え
「refcount=1」になると思いました。
理由として、新しい変数コンテナが int 型と値 1 で作成され、そのコンテナを指すシンボル$i
が1つあるため、refcountが1になると思いました。
ドキュメントにも以下のようにあります:
「refcount」と呼ばれ、この1つの zval コンテナをどれだけ多くの 変数名(シンボルとも呼ばれます)が指すかを含みます。
補足
しかし int や string などの型の変数は、代入演算子 = によって「元の変数を新しい変数にコピーする (値による代入)」ために、通常の代入では refcount は増えない。
という説明が、(PHPドキュメントではない)他のサイトにありました。
たしかに、”clone
でrefcountが増えない”ということと同様なのかと思えてきました。
しかし、ドキュメントには以下のように記載があります。
$a = "new string";
xdebug_debug_zval('a');
上の例の出力は以下となります。
a: (refcount=1, is_ref=0)='new string'
この変数を他の変数名に代入すると、refcount が増加します。
$a = "new string";
$b = $a;
xdebug_debug_zval( 'a' );
上の例の出力は以下となります。
a: (refcount=2, is_ref=0)='new string'
記載内容が最新の情報でなく、バージョンによる違いなのでしょうか。