php5 と php7 のガベージ コレクション メカニズムはどちらも参照カウントを使用します。
#参照カウントとは何ですか?
PHP は C で書かれているため、C には構造体と呼ばれるものがあります。PHP 変数はこの方法で C に保存されます。 各 PHP 変数は、zval というコンテナーに存在します。zval コンテナーには、変数名と値に加えて、2 バイトの追加情報も含まれています。1 つは「is_ref」と呼ばれるブール値です。 , この変数が参照コレクションに属しているかどうかを示すために使用されます。このバイトを通じて、PHP で通常の変数と参照変数を区別できます。2 番目の追加バイトは 'refcount' で、このコンテナを指す変数の数を示すために使用されます。 番号。PHP5 での出力:
person: (refcount=1, is_ref=0), array (size=2) 'name' => (refcount=1, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19
PHP7 での出力:
person: (refcount=2, is_ref=0) array (size=2) 'name' => (refcount=1, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19
$person['hello'] = $person['name']
PHP7 での出力:
person: (refcount=1, is_ref=0) array (size=3) 'name' => (refcount=3, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19 'hello' => (refcount=3, is_ref=0)string '看看' (length=6)
PHP5 の出力:
person: (refcount=1, is_ref=0), array (size=3) 'name' => (refcount=2, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19 'hello' => (refcount=2, is_ref=0),string '看看' (length=6)
概要:
PHP5 と PHP7 のガベージ コレクション メカニズムはどちらも参照カウントに属します。複雑なデータ型のアルゴリズム処理に関して: zval は PHP7 に新しい実装を備えています。最も基本的な変更は、*zval で必要なメモリがヒープとは別に割り当てられなくなり、参照カウントが単独で格納されなくなったことです。複雑なデータ型 (文字列、配列、オブジェクトなど) の参照カウントは、それ自体で保存されます。この実装には次の利点があります:
1. 単純なデータ型では、メモリを個別に割り当てる必要がなく、カウントする必要もありません; 2 . 二重カウントはなくなります。オブジェクトでは、オブジェクト自体に保存されているカウントのみが有効です; 3. カウントは値自体によって保存されるため、zval 間など、非 zval 構造内のデータと共有できます。そしてハッシュ可能なキー。 推奨チュートリアル:以上がphp7のガベージコレクションとphp5の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。