рд╣рдо C ++ рдореЗрдВ PHP рдореЙрдбреНрдпреВрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рднрд╛рдЧ 1: Zend рдЗрдВрдЬрди 2 рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рднреНрд░рдордг

рд╢реБрдн рджрд┐рди, рдкреНрд░рд┐рдп рд╣рд░рдмрд╕ рд╕рдореБрджрд╛рдп!

рдмрд┐рд▓реНрд▓реА рдХреЗ рддрд╣рдд рд╕реА ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PHP рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦреА рдЧрдИ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ (рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдВрдЧреНрд░реЗрдЬреА) рд╕реЗ рдорд┐рд▓реА рдФрд░ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЬрд╝реЗрдВрдб рдЗрдВрдЬрди 2 рд╕реНрд░реЛрдд рдЙрдард╛ рд░рд╣рд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЗрд╕рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ, рддреЛ рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рддреЛ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ:

рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ C ++ рдирд╣реАрдВ рдорд┐рд▓рд╛ ... =)

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



рдЬрд╝реЗрдВрдбрд░ рдЗрдВрдЬрди 2 рдХреА рдЖрдВрддрд░рд┐рдХ рджреБрдирд┐рдпрд╛


рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░

Zend Engine 2 рдХреЛ C. рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдиреЗ рдЗрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдХреНрд▓рд╛рд╕-рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ - рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд┐: рд╢реБрд▓реНрдХ рдХрд╛рд░реНрдп, рдФрд░ рд╕рдорд╛рдирддрд╛рдПрдВ - ZE 2 рдХреЗ рднреАрддрд░ рдкреИрджрд╛ рд╣реБрдИ рд╣реИрдВред рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рд░рд▓ рдФрд░ рд╕рдордЧреНрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╣реИрдВред

рд╕рдмрд╕реЗ рдЖрдо рд╕рдВрд░рдЪрдирд╛ zval (zend-value?) рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдпреВрдЬрд░реНрд╕рд╕реНрдкреЗрд╕ рдХреЗ рдмреИрдХ рдкрд░ PHP рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ (рдпрд╣рд╛рдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж, рдпреВрдЬрд░реНрд╕ рдХрд╛ рдорддрд▓рдм PHP рдореЗрдВ рд▓рд┐рдЦрд╛ рдХреЛрдб рд╣реЛрдЧрд╛, рдЬреЛ ZE рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдХрд╛ рд░рд┐рд╡рд░реНрд╕ рд╕рд╛рдЗрдб C рдХреЛрдб рд╣реИ)ред
PHP рдХрдордЬреЛрд░ рдЧрддрд┐рд╢реАрд▓ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рд╡рд╛рд▓реА рдПрдХ рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЪрд░ рдЕрдкрдиреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦреЗрдЧрд╛)ред рдЗрди рд╕рдирдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдлреБрд▓реНрд▓рд┐рдд рдФрд░ рдЬрд╝рд╡рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ ( PHP 5.3.3 ) рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (zend.h):

typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; }; 

рд╣рдо рдпрд╣рд╛рдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ? рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, zend рдореВрд▓реНрдп (zval) рд╕реАрдзреЗ рдПрдХ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИред рдЪрд░ рдХрд╛ рдорд╛рди рдорд╛рди рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ zvalue_value (рдиреАрдЪреЗ) рд╣реИред рдореВрд▓реНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (zend.h):

  #define IS_NULL 0 #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 

рд╣рд╛рдБ, рдпрд╣рд╛рдБ рд╡реЗ рд╣реИрдВ - рдпреЗ рдмрд╣реБрдд рд╣реА 8 рдкреНрд░рдХрд╛рд░ рдХреЗ PHP рдбреЗрдЯрд╛ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдкреНрд▓рд╕ рдЯреВ рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди IS_CONSTANT рдФрд░ IS_CONSTANT_ARRAY рдорд╛рдиред

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЗрд╕ рдЪрд░ (refcount__gc) рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рдПрдХ рдзреНрд╡рдЬ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЪрд░ рд╕рдВрджрд░реНрдн рд╣реИ (is_ref__gc)ред ZE рдХреЗ рдЕрдВрджрд░ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рднрд╛рд╡реА рдХрд╛рд░реНрдп рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐:

 <?php $foo = 5; // 1 $bar = $foo; // 2 

IS_LONG рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЬрд╝рд╡рд▓ рд╡реИрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ (рдпреВрдЬрд░реНрд╕рд╕реНрдкреЗрд╕ рдореЗрдВ рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХ, рдпреВрдЬрд░реНрд╕рд╕реНрдкреЗрд╕ рдХреЗ рджреВрд╕рд░реА рддрд░рдл C рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ), рдЗрд╕рдХреЗ is_ref_gc рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ refcount_gc рдХреЛ 1 (рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐) рдФрд░ рд╡рд░реНрдг "foo" рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ (рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХ) рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ (рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдШрд╛рдЯреА рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдЪрд░ рдирд╛рдо рдФрд░ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА)ред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдЬрд╝рд╡рд▓ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реИрд▓ рд╕рд┐рд░реНрдл рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ 1 рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рдмрд╛рд░ рдкреНрд░рддреАрдХ рдХреЛ рдЙрд╕реА рдШрд╛рдЯреА рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд╕реЗ рдирдП рдЪрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред
рдЬрдм рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛрдб рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ:

 ... $bar = '42'; 

рд╡рд╣ рдкреНрд░рддреАрдХ "рдмрд╛рд░" рдХреЗ рдЕрдиреБрд░реВрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╝рд╡рд▓ рдХреЗ рд╡рд░реНрдгреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдирд┐рдХрд╛рд▓реЗрдЧрд╛, рдФрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдорд╛рди рдХреЗ рд▓рд┐рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдпрджрд┐ рдпрд╣ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдЬрд╝рд╡рд▓ рдПрдХ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ (is_ref_gc == 0), рддреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ $ рдмрд╛рд░ рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдЧрд╛, рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧрд╛ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдХреЛ '42' рдХреЗ рдмрд░рд╛рдмрд░ рдХрд░реЗрдЧрд╛) рдФрд░ "рдмрд╛рд░" рдХреЛ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рдЦреЗрдВред рдирдпрд╛ рдореВрд▓реНрдпред рдпрджрд┐ refcoun_gc == 1 рдпрд╛ is_ref_gc == 1 рд╣реИ, рддреЛ рдХреНрд░рд┐рдпрд╛рдПрдБ рд╕реАрдзреЗ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдкрд░ рдХреА рдЬрд╛рдПрдВрдЧреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рдмрд▓реНрдХрд┐ рдХреГрддреНрд░рд┐рдо, рд▓реЗрдХрд┐рди рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реЛрдиреЗ) рд╕реНрдерд┐рддрд┐:

 <?php $foo = 100500; //1 $bar = $foo; //2 echo $bar; unset($bar); $foo = '42'; //3 

рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рд░рд╛рд╢рд┐ рдЦрд░реНрдЪ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рджреЛ рд╡рд░реНрдгред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯрд┐рдкреНрдкрдгреА 1 рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдкрд░, zval val рдХреЛ 1 рдХреЗ рдмрд░рд╛рдмрд░ рд▓рд┐рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЯрд┐рдкреНрдкрдгреА 2 рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдкрд░, рд╡реИрд▓ рд╡реИрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдкреНрд░рддреАрдХ "рдмрд╛рд░" рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП refcoun_gc рдкрд╣рд▓реЗ рд╕реЗ 2 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА 3 рдХреЗ рд╕рд╛рде, рдПрдХ рдирдпрд╛ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдирд╕реЗрдЯ ($ рдмрд╛рд░) рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡реИрд▓ рдХреЗ рд▓рд┐рдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдлрд┐рд░ рд╕реЗ 1 рд╣реЛ рдЬрд╛рдПрдЧреАред
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ is_ref_gc 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рдкрддреНрд░ $ b = & $ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВред
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ "рд▓рд┐рдЦрдиреЗ рдкрд░ рдЕрд▓рдЧ" рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ zvalue_value (zend.h):

 typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value; 

рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдШ рд╣реИ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ zvalue_value рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рдкрддреЗ рдкрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрдбрд╝реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕реНрддрд░ рдкрд░ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдЪрд░рдг рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдШ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ zvalue_value рдХреА рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ PHP рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЪрд░ рдХреЛ рдкреВрд░реЗ рдЬреАрд╡рди рдореЗрдВ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рдЪрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдХреЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ 5 рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ 8. PHP рдкреНрд░рдХрд╛рд░ рдХреА рдореИрдкрд┐рдВрдЧ zvalue_value рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

Zvalue_value рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
  1. рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд╕реНрдкреЗрд╕ рдореЗрдВ рдПрдХ рдХрд╛рд▓реЗ рдШреЛрдбрд╝реЗ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдХреЗ рджреВрд╕рд░реА рддрд░рдл, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдУрдкрди рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░, рдПрдХ рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рдирдЪрд┐рддреНрд░рдг рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рднрдВрдбрд╛рд░рдг (рд╕реА рддрд░рдл, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред
  2. PHP рдХреЗ рд╕рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдЧреЛрдВ рдореЗрдВ рджреЛрд╣рд░реА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреА рд╣реИрдВред
  3. рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдмрд╛рдЗрдирд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЕрдВрджрд░ рдЕрд╢рдХреНрдд рдкрд╛рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдПрдХ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рдд рд╣реИред рд╕реНрдЯреЗрдкрд▓ рдСрдкрд░реЗрд╢рди рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдореЗрдВ рддреЗрдЬ рд╣реИред рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЕрд╢рдХреНрдд рд╡рд░реНрдг рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрд┐рд▓реНрдХреБрд▓ рд╢реВрдиреНрдп-рд╕рдорд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░рд▓реЗрди рдХрд╛ рддрд┐рд░рд╕реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  4. рдПрд░реЗ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд╣реИрд╢рдЯреЗрдмрд▓ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрд╢рдЯреЗрдмрд▓ рдПрдХ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИрдВред
  5. PHP рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ zend_object_value рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
  6. PHP рдореЗрдВ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдиреЗ рд╕реЗ 32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдХрдо рд╕реЗ рдХрдо 16 рдмрд╛рдЗрдЯреНрд╕ рдЦрд░реНрдЪ рд╣реЛрдВрдЧреЗ, рдЪрд╛рд╣реЗ рд╡рд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡реИрд░рд┐рдПрдмрд▓ рд╣реЛ (рдЬреЛрд╡рд▓ рдлреАрд▓реНрдбреНрд╕ рдХреЗ рд╕рд╛рдЗрдЬ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпреВрдирд┐рдпрди рдХрд╛ рдЖрдХрд╛рд░ рдЙрд╕рдореЗрдВ рдореМрдЬреВрдж рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ)ред


рддреЛ рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ рд╣реИред Zend_object_value рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЙрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдХреНрд▓рд╛рд╕-рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рддрд┐рдорд╛рди рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреНрдпрд╛ рд╣реИ? рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрдирдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рд╣рдЬреАрд╡рди рд╣реИред рдЕрдм рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ zend_object_value (zend_type.h):

 typedef unsigned int zend_object_handle; typedef struct _zend_object_handlers zend_object_handlers; typedef struct _zend_object_value { zend_object_handle handle; zend_object_handlers *handlers; } zend_object_value; 

рд╕рдВрд░рдЪрдирд╛ рдХреБрдЫ рдкреВрд░реНрдгрд╛рдВрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рд╣реИрдВрдбрд▓) рдФрд░ рдПрдХ рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛ (zend_object_handlers * рд╣реИрдВрдбрд▓рд░) рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ ZE 2 рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рдХреБрдЫ рдШрдЯрдирд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред рдРрд╕реА рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЪрд░ рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЪрд░ (zend_object_add_ref_t add_ref), рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдирд╛, рджреВрд╕рд░реЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдЖрд░рдореНрдн рдХрд░рдирд╛ рдпрд╛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рд╕реЗ рдпреБрдХреНрдд рдЪрд░ рдХреЗ рд▓рд┐рдП unset рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ (zend_object_del_ref_t del_ref), __clone (zxone) рдХрд╣рдХрд░ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдЬреЛрдбрд╝рдирд╛ред clone_obj), рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА (zend_object_read_property_t read_property) рддрдХ рдкрд╣реБрдБрдЪ рдХрд░, рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рд▓рд┐рдЦрдирд╛ (zend_object_write_property_t write_property, рдЖрджрд┐) Zend_object_handlers рд╕рдВрд░рдЪрдирд╛ рд╕реНрд╡рдпрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ (zend_object_handlers.h):

 struct _zend_object_handlers { /* general object functions */ zend_object_add_ref_t add_ref; zend_object_del_ref_t del_ref; zend_object_clone_obj_t clone_obj; /* individual object functions */ zend_object_read_property_t read_property; zend_object_write_property_t write_property; zend_object_read_dimension_t read_dimension; zend_object_write_dimension_t write_dimension; zend_object_get_property_ptr_ptr_t get_property_ptr_ptr; zend_object_get_t get; zend_object_set_t set; zend_object_has_property_t has_property; zend_object_unset_property_t unset_property; zend_object_has_dimension_t has_dimension; zend_object_unset_dimension_t unset_dimension; zend_object_get_properties_t get_properties; zend_object_get_method_t get_method; zend_object_call_method_t call_method; zend_object_get_constructor_t get_constructor; zend_object_get_class_entry_t get_class_entry; zend_object_get_class_name_t get_class_name; zend_object_compare_t compare_objects; zend_object_cast_t cast_object; zend_object_count_elements_t count_elements; zend_object_get_debug_info_t get_debug_info; zend_object_get_closure_t get_closure; }; 

рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдпрд╣рд╛рдВ рдкрдврд╝реЗрдВред

рд╡рд┐рдЪрд▓рд┐рдд, рд╡рд╛рдкрд╕ zend_object_value рдкрд░ред рддреЛ, рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рдорд╛рд░реЛрд╣-рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдВрдХреЗрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ! рдпрджрд┐ рд╣рдордиреЗ _zend_object_handlers рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рдХреБрдЫ рдЕрдВрд╢ рджреЗрдЦрд╛, рддреЛ рдХреБрдЫ рдЕрдЬреАрдм рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рд╣реИрдВрдбрд▓) рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдИ рдбреЗрдЯрд╛ рдЗрд╕рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдПрдХ рдирд┐рд░реНрд╡рд╛рдд рдореЗрдВ рдЧреЛрд▓рд╛рдХрд╛рд░) рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рддреЛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдЬрд╛рддреАрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рднрдВрдбрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдПрдХ рдЗрдХрд╛рдИ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдЧрд╛ред
ZE рдореЗрдВ рдРрд╕рд╛ рд╕реНрдЯреЛрд░реЗрдЬ Zend Object Storage рд╣реИ ред рдЗрд╕рдореЗрдВ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (zend_object_value.handle) рдФрд░ рдорд╛рди рд╣реИрдВ ... рд╣рд╛рдБ, рд╣рд╛рдБ, рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИ - рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ zend_object (zend.h) рд╣реИ:

 typedef struct _zend_object { zend_class_entry *ce; HashTable *properties; HashTable *guards; /* protects from __get/__set ... recursion */ } zend_object; 

рдпрд╣рд╛рдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЛрдВ рд╕реЗ, рдПрдХ рддреЗрд▓ рдЪрд┐рддреНрд░рдХрд▓рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдХрд╛рд░ рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реА рд╣реИред рд╣реИрд╢рдЯреЗрдмрд▓ * рдЧреБрдг - рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЧреБрдг рдлрд╝реАрд▓реНрдб ZE рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рдорд╛рдирдХ рд╣реИ, рдЬрд┐рд╕рдХреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдорд╛рди рдЗрд╕ рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реЗрддреНрд░ (рдЧреБрдг) рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ - рд╣рдо рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (zend_object_handlers рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ) рдФрд░ рд╣рдо рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ HashTable * рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБред рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ ... рдУрд╣ рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рдирдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ? рдЪреВрдВрдХрд┐ рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрдХ рд╡рд░реНрдЧ рдХреА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рд╕рднреА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧреАред рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ zend_class_entry (zend.h) рд╣реИ:

 struct _zend_class_entry { char type; char *name; zend_uint name_length; struct _zend_class_entry *parent; int refcount; zend_bool constants_updated; zend_uint ce_flags; HashTable function_table; HashTable default_properties; HashTable properties_info; HashTable default_static_members; HashTable *static_members; HashTable constants_table; const struct _zend_function_entry *builtin_functions; //  union _zend_function *constructor; //,    union _zend_function *destructor; //    union _zend_function *clone; union _zend_function *__get; union _zend_function *__set; union _zend_function *__unset; union _zend_function *__isset; union _zend_function *__call; union _zend_function *__callstatic; union _zend_function *__tostring; union _zend_function *serialize_func; union _zend_function *unserialize_func; zend_class_iterator_funcs iterator_funcs; /* handlers */ zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC); zend_object_iterator *(*get_iterator)(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC); int (*interface_gets_implemented)(zend_class_entry *iface, zend_class_entry *class_type TSRMLS_DC); /* a class implements this interface */ union _zend_function *(*get_static_method)(zend_class_entry *ce, char* method, int method_len TSRMLS_DC); /* serializer callbacks */ int (*serialize)(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC); int (*unserialize)(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC); zend_class_entry **interfaces; zend_uint num_interfaces; char *filename; zend_uint line_start; zend_uint line_end; char *doc_comment; zend_uint doc_comment_len; struct _zend_module_entry *module; }; 

Zend_class_entry рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рд╣реА рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рд╣реИред zend_class_entry рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд░реНрдЧ рд╣реА рд╣реИред рд╕рдВрд░рдЪрдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЖрдЗрдП рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдерд╛ред

const рд╕рдВрд░рдЪрдирд╛ _zend_function_entry * buildin_functions - _zend_function_entry рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХред рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпреЗ рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХреА рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЙрдиреНрд╕реНрдЯ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдпрд╛рдиреА, рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) (zend_object_value.handlers рдХреЗ рд╡рд┐рдкрд░реАрдд)ред

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб unserialize_func рдХреЗ рд▓рд┐рдП PHP рдореИрдЬрд┐рдХ рдореЗрдердб рд╣реИрдВ (рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реИ рдХрд┐ unserialize_func __wakeup рд╣реИ рдФрд░ рд╕реАрд░реАрдЬрд╝_func __sleep рд╣реИ, рдмрд╛рдХреА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдореЗрдиреЗрдорд┐рдХреНрд╕ рд╣реИрдВ)ред

рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЖрдк рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрддрд┐рдо, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо, ZE рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдЖрдХрд░реНрд╖рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЗрд╕ рднреНрд░рдордг рдХрд╛ рдирд╛рдпрдХ рд╡рд╣ рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдЬреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрд╡рдпрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ - zend_module_entry (zend_modules.h):

 struct _zend_module_entry { unsigned short size; unsigned int zend_api; unsigned char zend_debug; unsigned char zts; const struct _zend_ini_entry *ini_entry; const struct _zend_module_dep *deps; const char *name; const struct _zend_function_entry *functions; int (*module_startup_func)(INIT_FUNC_ARGS); int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); int (*request_startup_func)(INIT_FUNC_ARGS); int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); const char *version; size_t globals_size; #ifdef ZTS ts_rsrc_id* globals_id_ptr; #else void* globals_ptr; #endif void (*globals_ctor)(void *global TSRMLS_DC); void (*globals_dtor)(void *global TSRMLS_DC); int (*post_deactivate_func)(void); int module_started; unsigned char type; void *handle; int module_number; char *build_id; }; 

рдЪреВрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд - рдирд┐рд░реНрдпрд╛рдд рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ (рдкреНрд░рдХрд╛рд╢ рдУрдУрдкреА рдкрд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ), рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛:

  1. const рд╕рдВрд░рдЪрдирд╛ _zend_function_entry * рдлрд╝рдВрдХреНрд╢рди - рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдПрдХ рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХред Zend_class_entry.builtin_functions рдХреЗ рд╕рдорд╛рдиред
  2. int (* mod_startup_func) (INIT_FUNC_ARGS) - рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИ рдХрд┐ рд╡рд░реНрдЧреЛрдВ рдХреЛ ZE 2 рдХреА рдЖрдВрддрд░рд┐рдХ рдХрдХреНрд╖рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. int (* mod_shutdown_func) (SHUTDOWN_FUNC_ARGS) - рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬрд┐рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЕрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЦреБрдж рдХреЛ рдорд┐рдЯрд╛ рджреЗрдирд╛ рд╣реИред


рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо



рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ, рд╣рдордиреЗ рд╕рд╛рдорд╛рдиреНрдп zval рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп zend_module_entry рддрдХ рдХреЗ рдкрде рдХреА рдЬрд╛рдВрдЪ рдХреАред рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╣реБрдП, рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордиреНрд╡рд┐рдд рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЙрдбреНрдпреВрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд╕реНрдкреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реНрдХреВрд▓ рдХреА рддрд░рд╣ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (PHP_MINIT_FUNCTION рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ) рдФрд░ рдЗрд╕реЗ рд╢реНрд░рдо рд╡рд┐рдирд┐рдордп рдкрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ (рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлреЛрдХрд╕ рдХреЗ рд╕рд╛рде рднрд░реНрддреА рдПрдЬреЗрдВрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ PHP_MINIT_FUNCTION рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЧрдИ рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП), рдФрд░ рдлрд┐рд░, рдПрдХ рдХрд░реНрдордЪрд╛рд░реА (рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг) рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдкрд░, рдПрдХ рдлрд╛рдЗрдЯрд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░реЗрдВ (рдмрдирд╛рдПрдБ) рд╡рд╕реНрддреБ)ред рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ (zend_object_handlers) рдФрд░ рдЗрд╕рдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛ (zend_class_entry) рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рдХрд░рдирд╛, рдЬрд┐рд╕рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ Zend рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдмрд╛рдж рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рддреИрдпрд╛рд░реА рдЖрдорддреМрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди_name_objects_new рдореЗрдВ рд░рдЦреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдлрд╝реАрд▓реНрдб zend_class_entry.create_object рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рд╣реЛрддреА рд╣реИред

рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, рд╡рд┐рд╕реНрддрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рджреВрдВрдЧрд╛:



рдирд┐рд╖реНрдХрд░реНрд╖


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

PS рдЙрди рдЗрдЪреНрдЫреБрдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦреЛрдВ рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЪрдпрди рдпрд╣рд╛рдБ рд╣реИ ред

Source: https://habr.com/ru/post/In144582/


All Articles