ホームページ  >  記事  >  バックエンド開発  >  PHP の参照カウント機構の詳細な分析_PHP チュートリアル

PHP の参照カウント機構の詳細な分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:06:36835ブラウズ

PHP変数が宣言されて代入されると、変数名はシンボルテーブルに保存され、値とクラス情報はzvalに保存されますis_ref、refcount、value、type、zvalソース。コードは次のとおりです

コードをコピーします コードは次のとおりです:

struct _zval_struct {
/* 変数情報 */
zvalue_value 値 */
zend_uint refcount__gc; / * active type */
zend_uchar is_ref__gc;
} ;

refcount は、同じ値のアドレスを持つ zval がいくつあるかを示します。
is_ref は、zval が参照されているかどうかを示します。 0」と「1」

ここでは、zval がコピーされるとき、または新しいメモリ空間が開かれるときの分析を示します
1 is_ref=0 かつ refcount>1 の場合、zval を指す変数の値が変更されると、新しい zval、refcount -- 元の zval の例: $a=1;$b=$a;$b=2;、zval がコピーされます。つまり、元の ab は同じものを指します。 zval とその後の b は、新しい割り当て zval

2 を使用します。 is_ref=0 かつ refcount>1 の場合、zval が参照変数に割り当てられている場合、割り当てに使用される変数と割り当てられる変数は同じ元の変数を使用します。 zval、他のものは元の zval を指します。変数は新しくコピーされた zval を指し、refcount が再計算されます。例: $a=1;$b=$a;$c=$a;$d= &$a;、このとき、ad は元の zval を使用し、bc は新しくコピーされた zval を使用します

3 is_ref=1 および refcount>1 の場合、zval が非参照変数にコピーされる場合、非参照変数新しくコピーされた zval と元の zval が使用されます。refcount は変更されません。たとえば、$a=1;$b=&$a;$c=$a の場合、ab は元の zval を使用し、c は新しくコピーされた zval を使用します。
zval の値の型を表す type マクロは次のように定義されます

コードをコピーします コードは次のとおりです:
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_BOOL 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_STRING 6
#define IS_RESOURCE 7
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY 9


value は値を表しますzval の組合でもあるコードは次のとおりです


コードをコピーします
typedef Union _zvalue_ value { long lval ; HashTable *ht; /* ハッシュテーブル値 */ zend_object_value
これで、PHP がどのように型を変換するかがわかりました。その値は、実際には任意の型を表すことができる構造体に格納されており、特定の値は、コミュニティ内のどの変数が値を保存するために使用される型に基づいて決定されるためです


以下の例 1 を参照してください




コードをコピーします

コードは次のとおりです:

.----------
$a = 1;
$b = $ a;
$c = $a;.----------
$d = &$a;
.---------------
$a = 2; .-- --------$b = null;
refcount、is_ref、zvalの変更を確認します
最初の部分を実行した後、出力を見てください
1----------------------- ------- -
a:(refcount=3, is_ref=0),int 1
b:(refcount=3, is_ref=0),int 1
c:(refcount=3, is_ref=0) ,int 1
a、b、c に同じ zval を使用することがわかります

2 を実行した後の 2 番目の部分を見てください。 ----------
a:(refcount=2, is_ref=1),int 1
b:(refcount=2, is_ref=0),int 1
c:(refcount=2, is_ref= 0),int 1
d:(refcount =2, is_ref=1), int 1
この時点では a と d は一緒であり、同じ zval を使用し、bc は新しく生成された zval を使用し、refcount を再計算することに注意してください。と 2 つの zval の is_ref を同時に
3-- ------------------------
a:(refcount=2, is_ref= 1),int 2
b:(refcount=2, is_ref =0),int 1
c:(refcount=2, is_ref=0),int 1
d:(refcount=2, is_ref=1),int 2
is_ref=1 でこの二人の仲良しがわかります 同時に値も変化します
4---------------------------- ------
a: (refcount=2, is_ref=1), int 2
b:(refcount=1, is_ref=0),null
c:(refcount=1, is_ref=0),int 1
d:(refcount=2, is_ref=1),int 2
bc の zval の is_ref=0 のため、両者は良い友達ではなく、それらの値は同時に変更されないため、bc の zval は再び分割されます、b = null c = 1

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327623.html技術記事 PHP 変数が宣言され、値が割り当てられると、変数名がシンボル テーブルに格納され、値とクラス情報が zval に格納されます。zval には、is_ref、refcount、value、type、zval の 4 つの変数が含まれます。コードをコピーします...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。