рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╢реНрди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реИ, рд╣реИ рдирд╛?
рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЪрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЕрдВрдд рдореЗрдВ рдПрдХ рдЪрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рдХреИрд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПред
рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдВрджрд░ рд╕реЗ рдмрд╛рд╣рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?
рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдорд╛рди рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдпрд╛ рдЖрдк рдЗрд╕реЗ рдХрдм рд╣рдЯрд╛рддреЗ рд╣реИрдВ?
рдЪрд░ рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ?
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрди рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рдЕрдореВрд░реНрдд
PHP рдореЗрдВ рдЪрд░ рдХреЛ рдХреБрдЫ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░, рдореВрд▓реНрдп, рдЗрд╕ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЗрд╕ рдЪрд░ рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рд╕рдВрдХреЗрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╛рдЪрди
рдпрджрд┐ рдЖрдкрдиреЗ рд╕реА рдореЗрдВ рдХрднреА рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдмрд┐рдВрджреБрдУрдВ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рдирдХреЗ рдмрд┐рдирд╛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдкрд╛рд╕ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдбреЗрдЯрд╛, рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрддред C рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ, рдЖрдк рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рдПрдХ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЙрд╕ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
my_super_struct super_struct_instance;
рдкреЙрдЗрдВрдЯрд░реНрд╕ рд░реЗрдлрд░реЗрдВрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рддрд░рд╣ рд╣реЛрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЙрдирдХрд╛ рд╡реИрд▓реНрдпреВ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдбреНрд░реЗрд╕ рд╣реЛрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрдн рд╣реЛрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд╡реЗ рдбреАрдПрдлрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдб рдкрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░:
// foo, int int *foo; // int int bar = 3; // bar . // foo , bar foo = &bar; // ( ) // (*foo)++; // , // foo++;

рдХрдВрдЯреЗрдирд░
рдХрдВрдЯреЗрдирд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЬрд╝рд╡рд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
struct zval { zvalue_value value; zend_uchar type;
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд░реЗрдлрд╝рд░рд┐рдВрдЧ рдЪрд░ рдХрд╛ рдПрдХ рдорд╛рди, рдкреНрд░рдХрд╛рд░, рдзреНрд╡рдЬ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рд▓рдВрдмреА
- BOOL
- рдбрдмрд▓
- STRING
- ARRAY
- рд╡рд╕реНрддреБ
- рд╕рдВрд╕рд╛рдзрди
- рд╢реВрдиреНрдп
zvalue_value рдПрдХ рд╕рдВрдШ рд╣реИред рд╕рдВрдШ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рд╕рджрд╕реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
typedef union _zvalue_value { long lval; // integer double dval; // float struct { char *val; int len; } str; // string HashTable *ht; // array zend_object obj; // object } zvalue_value;
рдирддреАрдЬрддрди, рдЬрдм рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореЗрдореЛрд░реА рдореЗрдВ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд▓рдЧреЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпреВрдирд┐рдпрди рдХрд╛ рд╕рдмрд╕реЗ рднрд╛рд░реА рддрддреНрд╡ рд╣реИред

рдЗрддрдирд╛ рдХреНрдпреЛрдВ?
рдЕрдм рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ - рдХреНрдпреЛрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░рд┐рдлрдВрдб рд╣реИ?
рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ: рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЪрд░ рдХреЛ рджреВрд╕рд░реЗ рдЪрд░ рдХрд╛ рдорд╛рди рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддрд┐рдлрд▓ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред

(
рдпрд╣рд╛рдВ рдХреБрддреНрддреЗ рдХреЗ рд╕рд╛рде рдореВрд▓)
рдЕрдм, рдпрджрд┐ рдЖрдк рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдЪрд░ рдХрд╛ рдорд╛рди рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ PHP, refcount рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЗрд╕ zval рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдЧрд╛, рд╡рд╣рд╛рдБ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдЧрд╛, рдФрд░ рдЖрдкрдХрд╛ рдЪрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдП zval рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред
рдЕрдЧрд░ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рдкреАрдПрдЪрдкреА | рд╣реБрдб рдХреЗ рдиреАрдЪреЗ |
---|
$foo = "asd"; $bar = $foo; | bar,foo: { type: string, value: str: val: "asd" len: 3 is_ref: 0 refcount: 2 } |
$bar .= "q"; | foo: { type: string, value: str: val: "asd" len: 3 is_ref: 0 refcount: 1 } bar: { type: string, value: str: val: "asdq" len: 4 is_ref: 0 refcount: 1 } |
рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рд░рд╛рдЗрдЯ рдСрди рдХреЙрдкреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдореЗрдореЛрд░реА рдЦрдкрдд рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд░рд┐рдлрдХрд╛рдЙрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рд╕рднреА zval-s рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ refcount = 0 рд╣реЛрддрд╛ рд╣реИред
рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдХреНрдпреЛрдВ_ рд╣реИ?
рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рд▓рд┐рдВрдХ? рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рдЖрдк рдПрдХ рдЪрд░ рд╕реЗ рд▓рд┐рдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ is_ref рдзреНрд╡рдЬ 1 рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдЕрдиреБрдХреВрд▓рди рдЕрдм рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореИрдВ рдХреЛрдб рд╕рдордЭрд╛рдКрдВрдЧрд╛:
рдкреАрдПрдЪрдкреА | рд╣реБрдб рдХреЗ рдиреАрдЪреЗ |
---|
$foo = "asd"; $bar = $foo; | bar,foo: { type: string, value: str: val: "asd" len: 3 is_ref: 0 refcount: 2 } |
$zxc = &$foo; | zxc,foo: { type: string, value: str: val: "asd" len: 3 is_ref: 1 refcount: 2 } bar: { // bar zval type: string, value: str: val: "asd" len: 3 is_ref: 0 refcount: 1 } |
$qwe = $foo; | zxc,foo: { type: string, value: str: val: "asd" len: 3 is_ref: 1 refcount: 2 } bar: { type: string, value: str: val: "asd" len: 3 is_ref: 0 refcount: 1 } qwe: { // zval type: string, value: str: val: "asd" len: 3 is_ref: 0 refcount: 1 } |
рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рдлреВ рд╕реЗ рдПрдХ рдФрд░ рд▓рд┐рдВрдХ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдлреВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдЬрд╝рд╡рд▓ рдХрд╛ рдмрдЪрд╛рд╡ рдПрдХ рд╕реЗ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред
рд╢рд╛рдпрдж рдпрд╣ рд╕рдм (рдЕрднреА рдХреЗ рд▓рд┐рдП?), рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
PS рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрди рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдХреМрди рджреЗрдЦреЗрдЧрд╛, рдпрд╣ рдореБрдЭреЗ рдордЬрд╛рдХрд┐рдпрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ :) рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрдХреИрдирд░ рдирд╣реАрдВ рд╣реИ