このようなコードは、私たちの日常的なスクリプトで非常に一般的です。PHP がメモリを再割り当てし、変数の割り当てごとにデータをコピーする場合、上記のコードは 18 バイトのメモリ空間に適用する必要があります。上記のコードが実際にスペースの 2 つのコピーに適用する必要がないことは簡単にわかります。笑、PHP 開発者もそれを見たことがあるでしょう:
PHP の変数が使用されると前に述べました。symbol_table に格納されているシンボル名は zval に対応して実装されます。たとえば、上記のコードの最初の行では、値「var」が zval 構造体を指すポインタに対応して、symbol_table に格納され、変数値「laruence」「」がこの zval に保存されます。上記のコードの場合、「var」と「var_dup」に対応するポインターが同じ zval を指すようにできることは想像に難しくありません。
PHP もこれを行います。この時点で、これまで導入していなかった zval 構造体に refcount フィールドを導入する必要があります。
refcount は、その名前が示すように、現在の zval への参照の数を記録します。
たとえば、コードの場合:
気になる方は、var の refcount は 1 でなければなりませんか?
単純な変数の場合、PHP は値渡しであることを知っています。つまり、debug_zval_dump($var) が実行されると、$var が値によって debug_zval_dump に渡され、これにより、変数が割り当てられるときに var の refcount が 1 ずつ増加します。変数を指定すると、zval の refcount が 1 ずつ増加します。ここで、記事の冒頭のコードを振り返ってみましょう。unset($var) の最後の行が実行された後はどうなるでしょうか。はい、refcount は 1 減りますか? 上記のコード:
コードをコピーします
コードは次のとおりです: