参照カウントの基礎知識 公式サイトの答えは以下の通りです
各PHP変数は「zval」という変数コンテナに存在します
zval変数コンテナには、変数の型と値に加えて、変数には、2 バイトの追加情報 is_ref
と refcount
も含まれますis_ref
和 refcount
is_ref
是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来
refcount
is_ref
は、この変数が属するかどうかを識別するために使用されるブール値です参照セット(参照セット)に。このバイトを通じて、PHP エンジンは通常の変数と参照変数を区別できますrefcount
は、この zval 変数コンテナーを指す変数の数を表すために使用されます
PHP5 リファレンスPHP5 では、zval メモリはヒープとは別に割り当てられ (いくつかの例外を除き)、PHP はどの zval が使用中で、どの zval を解放する必要があるかを知る必要があります。したがって、これには参照カウントの使用が必要です。zval の refcount__gc の値は、zval 自体が参照された回数を保存するために使用されます (例:
<?php //php zval变量容器$a = 1;$b = 1;$c = &$a;$d = $b;$e = range(0, 3); xdebug_debug_zval('a'); xdebug_debug_zval('b'); xdebug_debug_zval('c'); xdebug_debug_zval('d'); xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 结果如下 a:(refcount=2, is_ref=1),int 1b:(refcount=2, is_ref=0),int 1c:(refcount=2, is_ref=1),int 1d:(refcount=2, is_ref=0),int 1e:(refcount=1, is_ref=0), array (size=4) 0 => (refcount=1, is_ref=0),int 0 1 => (refcount=1, is_ref=0),int 1 2 => (refcount=1, is_ref=0),int 2 3 => (refcount=1, is_ref=0),int 3
各変数には独自の番号があります
PHP7のzval
PHP7では、zvalが新しい実装になりました。最も基本的な変更は、zval に必要なメモリがヒープとは別に割り当てられなくなり、参照カウント自体も保存されなくなったことです。<?php //php zval变量容器$a = 1;$b = 1;$c = &$a;$d = $b;$e = range(0, 3); xdebug_debug_zval('a'); xdebug_debug_zval('b'); xdebug_debug_zval('c'); xdebug_debug_zval('d'); xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 结果如下 a:(refcount=2, is_ref=1)int 1b:(refcount=0, is_ref=0)int 1c:(refcount=2, is_ref=1)int 1d:(refcount=0, is_ref=0)int 1e:(refcount=1, is_ref=0)array (size=4) 0 => (refcount=0, is_ref=0)int 0 1 => (refcount=0, is_ref=0)int 1 2 => (refcount=0, is_ref=0)int 2 3 => (refcount=0, is_ref=0)int 3
以上がPHPのガベージコレクションメカニズムをマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。