Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

xdebug_debug_zval関数の結果の理由を教えてください。

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'

記載内容が最新の情報でなく、バージョンによる違いなのでしょうか。

0 likes

No Answers yet.

Your answer might help someone💌