±¾ÎĵÚÒ»²¿·ÖºÍµÚ¶þ¾ù·Òë×ÔNikita Popov(nikic£¬PHP ¹Ù·½¿ª·¢×é³ÉÔ±£¬°ØÁֿƼ¼´óѧµÄѧÉú) µÄ²©¿Í¡£ÎªÁ˸ü·ûºÏººÓïµÄÔĶÁϰ¹ß£¬ÎÄÖв¢²»»áÖð×ÖÖð¾äµÄ·Òë¡£
ÒªÀí½â±¾ÎÄ£¬ÄãÓ¦¸Ã¶Ô PHP5 ÖбäÁ¿µÄʵÏÖÓÐÁËһЩÁ˽⣬±¾ÎÄÖØµãÔÚÓÚ½âÊÍ PHP7 ÖÐ zval µÄ±ä»¯¡£
ÓÉÓÚ´óÁ¿µÄϸ½ÚÃèÊö£¬±¾ÎĽ«»á·Ö³ÉÁ½¸ö²¿·Ö£ºµÚÒ»²¿·ÖÖ÷ÒªÃèÊö zval(zend value) µÄʵÏÖÔÚ PHP5 ºÍ PHP7 ÖÐÓкβ»Í¬ÒÔ¼°ÒýÓõÄʵÏÖ¡£µÚ¶þ²¿·Ö½«»á·ÖÎöµ¥¶ÀÀàÐÍ£¨strings¡¢objects£©µÄϸ½Ú¡£
PHP5 ÖÐµÄ zval
PHP5 ÖÐ zval ½á¹¹Ì嶨ÒåÈçÏ£º
typedef struct _zval_struct { zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; } zval; |
ÈçÉÏ£¬zval °üº¬Ò»¸övalue¡¢Ò»¸ötypeÒÔ¼°Á½¸ö__gcºó׺µÄ×ֶΡ£valueÊǸöÁªºÏÌ壬ÓÃÓÚ´æ´¢²»Í¬ÀàÐ͵ÄÖµ£º
typedef union _zvalue_value { long lval; // ÓÃÓÚ bool ÀàÐÍ¡¢ÕûÐͺÍ×ÊÔ´ÀàÐÍ double dval; // ÓÃÓÚ¸¡µãÀàÐÍ struct { // ÓÃÓÚ×Ö·û´® char *val; int len; } str; HashTable *ht; // ÓÃÓÚÊý×é zend_object_value obj; // ÓÃÓÚ¶ÔÏó zend_ast *ast; // ÓÃÓÚ³£Á¿±í´ïʽ(PHP5.6 ²ÅÓÐ) } zvalue_value; |
C ÓïÑÔÁªºÏÌåµÄÌØÕ÷ÊÇÒ»´ÎÖ»ÓÐÒ»¸ö³ÉÔ±ÊÇÓÐЧµÄ²¢ÇÒ·ÖÅäµÄÄÚ´æÓëÐèÒªÄÚ´æ×î¶àµÄ³ÉԱƥÅ䣨ҲҪ¿¼ÂÇÄÚ´æ¶ÔÆë£©¡£ËùÓгÉÔ±¶¼´æ´¢ÔÚÄÚ´æµÄͬһ¸öλÖ㬸ù¾ÝÐèÒª´æ´¢²»Í¬µÄÖµ¡£µ±ÄãÐèÒªlvalµÄʱºò£¬Ëü´æ´¢µÄÊÇÓзûºÅÕûÐΣ¬ÐèÒªdvalʱ£¬»á´æ´¢Ë«¾«¶È¸¡µãÊý¡£
ÐèÒªÖ¸³öµÄÊÇÊÇÁªºÏÌåÖе±Ç°´æ´¢µÄÊý¾ÝÀàÐÍ»á¼Ç¼µ½type×ֶΣ¬ÓÃÒ»¸öÕûÐÍÀ´±ê¼Ç£º
#define IS_NULL 0 /* Doesn't use value */ #define IS_LONG 1 /* Uses lval */ #define IS_DOUBLE 2 /* Uses dval */ #define IS_BOOL 3 /* Uses lval with values 0 and 1 */ #define IS_ARRAY 4 /* Uses ht */ #define IS_OBJECT 5 /* Uses obj */ #define IS_STRING 6 /* Uses str */ #define IS_RESOURCE 7 /* Uses lval, which is the resource ID */ /* Special types used for late-binding of constants */ #define IS_CONSTANT 8 #define IS_CONSTANT_AST 9 |
PHP5 ÖеÄÒýÓüÆÊý
ÔÚPHP5ÖУ¬zval µÄÄÚ´æÊǵ¥¶À´Ó¶Ñ£¨heap£©ÖзÖÅäµÄ£¨ÓÐÉÙÊýÀýÍâÇé¿ö£©£¬PHP ÐèÒªÖªµÀÄÄЩ zval ÊÇÕýÔÚʹÓõģ¬ÄÄЩÊÇÐèÒªÊͷŵġ£ËùÒÔÕâ¾ÍÐèÒªÓõ½ÒýÓüÆÊý£ºzval ÖÐrefcount__gcµÄÖµÓÃÓÚ±£´æ zval ±¾Éí±»ÒýÓõĴÎÊý£¬±ÈÈç$a = $b = 42Óï¾äÖУ¬42±»Á½¸ö±äÁ¿ÒýÓã¬ËùÒÔËüµÄÒýÓüÆÊý¾ÍÊÇ 2¡£Èç¹ûÒýÓüÆÊý±ä³É 0£¬¾ÍÒâζ×ÅÕâ¸ö±äÁ¿ÒѾûÓÐÓÃÁË£¬ÄÚ´æÒ²¾Í¿ÉÒÔÊÍ·ÅÁË¡£
×¢ÒâÕâÀïÌá¼°µ½µÄÒýÓüÆÊýÖ¸µÄ²»ÊÇ PHP ´úÂëÖеÄÒýÓã¨Ê¹ÓÃ&£©£¬¶øÊDZäÁ¿µÄʹÓôÎÊý¡£ºóÃæÁ½ÕßÐèҪͬʱ³öÏÖʱ»áʹÓáºPHP ÒýÓỺ͡ºÒýÓá»À´Çø·ÖÁ½¸ö¸ÅÄÕâÀïÏȺöÂÔµô PHP µÄ²¿·Ö¡£
Ò»¸öºÍÒýÓüÆÊý½ôÃÜÏà¹ØµÄ¸ÅÄîÊÇ¡ºÐ´Ê±¸´ÖÆ¡»£º¶ÔÓÚ¶à¸öÒýÓÃÀ´Ëµ£¬zaval Ö»ÓÐÔÚûÓб仯µÄÇé¿öϲÅÊǹ²ÏíµÄ£¬Ò»µ©ÆäÖÐÒ»¸öÒýÓøıä zval µÄÖµ£¬¾ÍÐèÒª¸´ÖÆ£¨¡±separated¡±£©Ò»·Ý zval£¬È»ºóÐ޸ĸ´ÖƺóµÄ zval¡£
ÏÂÃæÊÇÒ»¸ö¹ØÓÚ¡ºÐ´Ê±¸´ÖÆ¡»ºÍ zval µÄÏú»ÙµÄÀý×Ó£º
$a = 42; // $a -> zval_1(type=IS_LONG, value=42, refcount=1) $b = $a; // $a, $b -> zval_1(type=IS_LONG, value=42, refcount=2) $c = $b; // $a, $b, $c -> zval_1(type=IS_LONG, value=42, refcount=3) // ÏÂÃæ¼¸ÐÐÊǹØÓÚ zval ·ÖÀëµÄ $a += 1; // $b, $c -> zval_1(type=IS_LONG, value=42, refcount=2) // $a -> zval_2(type=IS_LONG, value=43, refcount=1) unset($b); // $c -> zval_1(type=IS_LONG, value=42, refcount=1) // $a -> zval_2(type=IS_LONG, value=43, refcount=1) unset($c); // zval_1 is destroyed, because refcount=0 // $a -> zval_2(type=IS_LONG, value=43, refcount=1) |
ÒýÓüÆÊýÓиöÖÂÃüµÄÎÊÌ⣺ÎÞ·¨¼ì²é²¢ÊÍ·ÅÑ»·ÒýÓã¨Ê¹ÓõÄÄڴ棩¡£ÎªÁ˽â¾öÕâÎÊÌ⣬PHP ʹÓÃÁËÑ»·»ØÊյķ½·¨¡£µ±Ò»¸ö zval µÄ¼ÆÊý¼õһʱ£¬¾ÍÓпÉÄÜÊôÓÚÑ»·µÄÒ»²¿·Ö£¬Õâʱ½« zval дÈëµ½¡º¸ù»º³åÇø¡»ÖС£µ±»º³åÇøÂúʱ£¬Ç±ÔÚµÄÑ»·»á±»´òÉϱê¼Ç²¢½øÐлØÊÕ¡£
ÒòΪҪ֧³ÖÑ»·»ØÊÕ£¬Êµ¼ÊʹÓÃµÄ zval µÄ½á¹¹Êµ¼ÊÉÏÈçÏ£º
typedef struct _zval_gc_info { zval z; union { gc_root_buffer *buffered; struct _zval_gc_info *next; } u; } zval_gc_info; |
zval_gc_info½á¹¹ÌåÖÐǶÈëÁËÒ»¸öÕý³£µÄ zval ½á¹¹£¬Í¬Ê±Ò²Ôö¼ÓÁËÁ½¸öÖ¸Õë²ÎÊý£¬µ«Êǹ²ÊôÓÚͬһ¸öÁªºÏÌåu£¬ËùÒÔʵ¼ÊʹÓÃÖÐÖ»ÓÐÒ»¸öÖ¸ÕëÊÇÓÐÓõġ£bufferedÖ¸ÕëÓÃÓÚ´æ´¢ zval ÔÚ¸ù»º³åÇøµÄÒýÓõØÖ·£¬ËùÒÔÈç¹ûÔÚÑ»·»ØÊÕÖ´ÐÐ֮ǰ zval ÒѾ±»Ïú»ÙÁË£¬Õâ¸ö×ֶξͿÉÄܱ»ÒƳýÁË¡£nextÔÚ»ØÊÕÏú»ÙÖµµÄʱºòʹÓã¬ÕâÀï²»»áÉîÈë¡£
Ð޸͝»ú
ÏÂÃæËµËµ¹ØÓÚÄÚ´æÊ¹ÓÃÉϵÄÇé¿ö£¬ÕâÀï˵µÄ¶¼ÊÇÖ¸ÔÚ 64 λµÄϵͳÉÏ¡£Ê×ÏÈ£¬ÓÉÓÚstrºÍobjÕ¼ÓõĴóСһÑù£¬zvalue_valueÕâ¸öÁªºÏÌåÕ¼Óà 16 ¸ö×Ö½Ú£¨bytes£©µÄÄÚ´æ¡£Õû¸özval½á¹¹ÌåÕ¼ÓõÄÄÚ´æÊÇ 24 ¸ö×Ö½Ú£¨¿¼Âǵ½ÄÚ´æ¶ÔÆë£©£¬zval_gc_infoµÄ´óСÊÇ 32 ¸ö×Ö½Ú¡£×ÛÉÏ£¬ÔÚ¶Ñ£¨Ïà¶ÔÓÚÕ»£©·ÖÅ䏸 zval µÄÄÚ´æÐèÒª¶îÍâµÄ 16 ¸ö×Ö½Ú£¬ËùÒÔÿ¸ö zval ÔÚ²»Í¬µÄµØ·½Ò»¹²ÐèÒªÓõ½ 48 ¸ö×Ö½Ú£¨ÒªÀí½âÉÏÃæµÄ¼ÆË㷽ʽÐèҪעÒâÿ¸öÖ¸ÕëÔÚ 64 λµÄϵͳÉÏÒ²ÐèÒªÕ¼Óà 8 ¸ö×Ö½Ú£©¡£
ÔÚÕâµãÉϲ»¹Ü´Óʲô·½ÃæÈ¥¿¼ÂǶ¼¿ÉÒÔÈÏΪ zval µÄÕâÖÖÉè¼ÆÐ§ÂÊÊǺܵ͵ġ£±ÈÈç zval ÔÚ´æ´¢ÕûÐ͵Äʱºò±¾ÉíÖ»ÐèÒª 8 ¸ö×Ö½Ú£¬¼´Ê¹¿¼Âǵ½ÐèÒª´æÒ»Ð©¸½¼ÓÐÅÏ¢ÒÔ¼°ÄÚ´æ¶ÔÆë£¬¶îÍâ 8 ¸ö×Ö½ÚÓ¦¸ÃÒ²ÊÇ×ã¹»µÄ¡£
ÔÚ´æ´¢ÕûÐÍʱ±¾À´È·ÊµÐèÒª 16 ¸ö×Ö½Ú£¬µ«ÊÇʵ¼ÊÉÏ»¹ÓÐ 16 ¸ö×Ö½ÚÓÃÓÚÒýÓüÆÊý¡¢16 ¸ö×Ö½ÚÓÃÓÚÑ»·»ØÊÕ¡£ËùÒÔ˵ zval µÄÄÚ´æ·ÖÅäºÍÊͷŶ¼ÊÇÏûºÄºÜ´óµÄ²Ù×÷£¬ÎÒÃÇÓбØÒª¶ÔÆä½øÐÐÓÅ»¯¡£
´ÓÕâ¸ö½Ç¶È˼¿¼£ºÒ»¸öÕûÐÍÊý¾ÝÕæµÄÐèÒª´æ´¢ÒýÓüÆÊý¡¢Ñ»·»ØÊÕµÄÐÅÏ¢²¢ÇÒµ¥¶ÀÔÚ¶ÑÉÏ·ÖÅäÄÚ´æÂ𣿴ð°¸Êǵ±È»²»£¬ÕâÖÖ´¦Àí·½Ê½Ò»µã¶¼²»ºÃ¡£
ÕâÀï×ܽáһϠPHP5 ÖÐ zval ʵÏÖ·½Ê½´æÔÚµÄÖ÷ÒªÎÊÌ⣺
- zval ×ÜÊǵ¥¶À´Ó¶ÑÖзÖÅäÄڴ棻
- zval ×ÜÊÇ´æ´¢ÒýÓüÆÊýºÍÑ»·»ØÊÕµÄÐÅÏ¢£¬¼´Ê¹ÊÇÕûÐÍÕâÖÖ¿ÉÄܲ¢²»ÐèÒª´ËÀàÐÅÏ¢µÄÊý¾Ý£»
- ÔÚʹÓöÔÏó»òÕß×ÊԴʱ£¬Ö±½ÓÒýÓûᵼÖÂÁ½´Î¼ÆÊý£¨ÔÒò»áÔÚÏÂÒ»²¿·Ö½²£©£»
- ijЩ¼ä½Ó·ÃÎÊÐèÒªÒ»¸ö¸üºÃµÄ´¦Àí·½Ê½¡£±ÈÈçÏÖÔÚ·ÃÎÊ´æ´¢ÔÚ±äÁ¿ÖеĶÔÏó¼ä½ÓʹÓÃÁËËĸöÖ¸Õ루ָÕëÁ´µÄ³¤¶ÈΪËÄ£©¡£Õâ¸öÎÊÌâÒ²·Åµ½ÏÂÒ»²¿·ÖÌÖÂÛ£»
- Ö±½Ó¼ÆÊýÒ²¾ÍÒâζ×ÅÊýÖµÖ»ÄÜÔÚ zval Ö®¼ä¹²Ïí¡£Èç¹ûÏëÔÚ zval ºÍ hashtable key Ö®¼ä¹²ÏíÒ»¸ö×Ö·û´®¾Í²»ÐУ¨³ý·Ç hashtable key Ò²ÊÇ zval£©¡£
PHP7 ÖÐµÄ zval
ÔÚ PHP7 ÖÐ zval ÓÐÁËеÄʵÏÖ·½Ê½¡£×î»ù´¡µÄ±ä»¯¾ÍÊÇ zval ÐèÒªµÄÄÚ´æ²»ÔÙÊǵ¥¶À´Ó¶ÑÉÏ·ÖÅ䣬²»ÔÙ×Ô¼º´æ´¢ÒýÓüÆÊý¡£¸´ÔÓÊý¾ÝÀàÐÍ£¨±ÈÈç×Ö·û´®¡¢Êý×éºÍ¶ÔÏ󣩵ÄÒýÓüÆÊýÓÉÆä×ÔÉíÀ´´æ´¢¡£ÕâÖÖʵÏÖ·½Ê½ÓÐÒÔϺô¦£º
- ¼òµ¥Êý¾ÝÀàÐͲ»ÐèÒªµ¥¶À·ÖÅäÄڴ棬Ҳ²»ÐèÒª¼ÆÊý£»
- ²»»áÔÙÓÐÁ½´Î¼ÆÊýµÄÇé¿ö¡£ÔÚ¶ÔÏóÖУ¬Ö»ÓжÔÏó×ÔÉí´æ´¢µÄ¼ÆÊýÊÇÓÐЧµÄ£»
- ÓÉÓÚÏÖÔÚ¼ÆÊýÓÉÊýÖµ×ÔÉí´æ´¢£¬ËùÒÔÒ²¾Í¿ÉÒÔºÍ·Ç zval ½á¹¹µÄÊý¾Ý¹²Ïí£¬±ÈÈç zval ºÍ hashtable key Ö®¼ä£»
- ¼ä½Ó·ÃÎÊÐèÒªµÄÖ¸ÕëÊý¼õÉÙÁË¡£
ÎÒÃÇ¿´¿´ÏÖÔÚ zval ½á¹¹ÌåµÄ¶¨Ò壨ÏÖÔÚÔÚ zend_types.h ÎļþÖУ©£º
struct _zval_struct { zend_value value; /* value */ union { struct { ZEND_ENDIAN_LOHI_4( zend_uchar type, /* active type */ zend_uchar type_flags, zend_uchar const_flags, zend_uchar reserved) /* call info for EX(This) */ } v; uint32_t type_info; } u1; union { uint32_t var_flags; uint32_t next; /* hash collision chain */ uint32_t cache_slot; /* literal cache slot */ uint32_t lineno; /* line number (for ast nodes) */ uint32_t num_args; /* arguments number for EX(This) */ uint32_t fe_pos; /* foreach position */ uint32_t fe_iter_idx; /* foreach iterator index */ } u2; }; |
½á¹¹ÌåµÄµÚÒ»¸öÔªËØÃ»Ì«´ó±ä»¯£¬ÈÔÈ»ÊÇÒ»¸ö value ÁªºÏÌå¡£µÚ¶þ¸ö³ÉÔ±ÊÇÓÉÒ»¸ö±íʾÀàÐÍÐÅÏ¢µÄÕûÐͺÍÒ»¸ö°üº¬Ëĸö×Ö·û±äÁ¿µÄ½á¹¹Ìå×é³ÉµÄÁªºÏÌ壨¿ÉÒÔºöÂÔ ZEND_ENDIAN_LOHI_4 ºê£¬ËüÖ»ÊÇÓÃÀ´½â¾ö¿çƽ̨´óС¶ËÎÊÌâµÄ£©¡£Õâ¸ö×ӽṹÖбȽÏÖØÒªµÄ²¿·ÖÊÇ type£¨ºÍÒÔǰÀàËÆ£©ºÍ type_flags£¬Õâ¸ö½ÓÏÂÀ´»á½âÊÍ¡£
ÉÏÃæÕâ¸öµØ·½Ò²ÓÐÒ»µãСÎÊÌ⣺value ±¾À´Ó¦¸ÃÕ¼ 8 ¸ö×Ö½Ú£¬µ«ÊÇÓÉÓÚÄÚ´æ¶ÔÆë£¬ÄÄÅÂÖ»Ôö¼ÓÒ»¸ö×Ö½Ú£¬Êµ¼ÊÉÏÒ²ÊÇÕ¼Óà 16 ¸ö×Ö½Ú£¨Ê¹ÓÃÒ»¸ö×Ö½Ú¾ÍÒâζ×ÅÐèÒª¶îÍâµÄ 8 ¸ö×Ö½Ú£©¡£µ«ÊÇÏÔÈ»ÎÒÃDz¢²»ÐèÒª 8 ¸ö×Ö½ÚÀ´´æ´¢Ò»¸ö type ×ֶΣ¬ËùÒÔÎÒÃÇÔÚ u1 µÄºóÃæÔö¼ÓÁËÁËÒ»¸öÃûΪ u2 µÄÁªºÏÌ塣ĬÈÏÇé¿öÏÂÊÇÓò»µ½µÄ£¬ÐèҪʹÓõÄʱºò¿ÉÒÔÓÃÀ´´æ´¢ 4 ¸ö×Ö½ÚµÄÊý¾Ý¡£Õâ¸öÁªºÏÌå¿ÉÒÔÂú×㲻ͬ³¡¾°ÏµÄÐèÇó¡£
PHP7 ÖÐ value µÄ½á¹¹¶¨ÒåÈçÏ£º
typedef union _zend_value { zend_long lval; /* long value */ double dval; /* double value */ zend_refcounted *counted; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; zend_reference *ref; zend_ast_ref *ast; zval *zv; void *ptr; zend_class_entry *ce; zend_function *func; struct { uint32_t w1; uint32_t w2; } ww; } zend_value; |
Ê×ÏÈÐèҪעÒâµÄÊÇÏÖÔÚ value ÁªºÏÌåÐèÒªµÄÄÚ´æÊÇ 8 ¸ö×Ö½Ú¶ø²»ÊÇ 16¡£ËüÖ»»áÖ±½Ó´æ´¢ÕûÐÍ£¨lval£©»òÕ߸¡µãÐÍ£¨dval£©Êý¾Ý£¬ÆäËûÇé¿ö϶¼ÊÇÖ¸Õ루ÉÏÃæÌáµ½¹ý£¬Ö¸ÕëÕ¼Óà 8 ¸ö×Ö½Ú£¬×îÏÂÃæµÄ½á¹¹ÌåÓÉÁ½¸ö 4 ×Ö½ÚµÄÎÞ·ûºÅÕûÐÍ×é³É£©¡£ÉÏÃæËùÓеÄÖ¸ÕëÀàÐÍ£¨³ýÁËÌØÊâ±ê¼ÇµÄ£©¶¼ÓÐÒ»¸öͬÑùµÄÍ·£¨zend_refcounted£©ÓÃÀ´´æ´¢ÒýÓüÆÊý£º
typedef struct _zend_refcounted_h { uint32_t refcount; /* reference counter 32-bit */ union { struct { ZEND_ENDIAN_LOHI_3( zend_uchar type, zend_uchar flags, /* used for strings & objects */ uint16_t gc_info) /* keeps GC root number (or 0) and color */ } v; uint32_t type_info; } u; } zend_refcounted_h; |
ÏÖÔÚ£¬Õâ¸ö½á¹¹Ìå¿Ï¶¨»á°üº¬Ò»¸ö´æ´¢ÒýÓüÆÊýµÄ×ֶΡ£³ý´ËÖ®Í⻹ÓÐ type¡¢flags ºÍ gc_info¡£type ´æ´¢µÄºÍ zval ÖÐµÄ type ÏàͬµÄÄÚÈÝ£¬ÕâÑù GC ÔÚ²»´æ´¢ zval µÄÇé¿öϵ¥¶ÀʹÓÃÒýÓüÆÊý¡£flags ÔÚ²»Í¬µÄÊý¾ÝÀàÐÍÖÐÓв»Í¬µÄÓÃ;£¬Õâ¸ö·Åµ½ÏÂÒ»²¿·Ö½²¡£
gc_info ºÍ PHP5 ÖÐµÄ buffered ×÷ÓÃÏàͬ£¬²»¹ý²»ÔÙÊÇλÓÚ¸ù»º³åÇøµÄÖ¸Õ룬¶øÊÇÒ»¸öË÷ÒýÊý×Ö¡£ÒòΪÒÔǰ¸ù»º³åÇøµÄ´óСÊǹ̶¨µÄ£¨10000 ¸öÔªËØ£©£¬ËùÒÔʹÓÃÒ»¸ö 16 루2 ×Ö½Ú£©µÄÊý×Ö´úÌæ 64 루8 ×Ö½Ú£©µÄÖ¸Õë×ã¹»ÁË¡£gc_info ÖÐͬÑù°üº¬Ò»¸ö¡ºÑÕÉ«¡»Î»ÓÃÓÚ»ØÊÕʱ±ê¼Ç½áµã¡£
zval ÄÚ´æ¹ÜÀí
ÉÏÎÄÌáµ½¹ý zval ÐèÒªµÄÄÚ´æ²»ÔÙµ¥¶À´Ó¶ÑÉÏ·ÖÅä¡£µ«ÊÇÏÔÈ»×ÜÒªÓеط½À´´æ´¢Ëü£¬ËùÒÔ»á´æÔÚÄÄÀïÄØ£¿Êµ¼ÊÉÏ´ó¶àʱºòËü»¹ÊÇλÓÚ¶ÑÖУ¨ËùÒÔǰÎÄÖÐÌáµ½µÄµØ·½Öص㲻ÊǶѣ¬¶øÊǵ¥¶À·ÖÅ䣩£¬Ö»²»¹ýÊÇǶÈëµ½ÆäËûµÄÊý¾Ý½á¹¹Öе쬱ÈÈç hashtable ºÍ bucket ÏÖÔھͻáÖ±½ÓÓÐÒ»¸ö zval ×ֶζø²»ÊÇÖ¸Õë¡£ËùÒÔº¯Êý±í±àÒë±äÁ¿ºÍ¶ÔÏóÊôÐÔÔڴ洢ʱ»áÊÇÒ»¸ö zval Êý×é²¢µÃµ½Ò»Õû¿éÄÚ´æ¶ø²»ÊÇÉ¢ÂäÔÚ¸÷´¦µÄ zval Ö¸Õ롣֮ǰµÄ zval * ÏÖÔÚ¶¼±ä³ÉÁË zval¡£
֮ǰµ± zval ÔÚÒ»¸öеĵط½Ê¹ÓÃʱ»á¸´ÖÆÒ»·Ý zval * ²¢Ôö¼ÓÒ»´ÎÒýÓüÆÊý¡£ÏÖÔÚ¾ÍÖ±½Ó¸´ÖÆ zval µÄÖµ£¨ºöÂÔ u2£©£¬Ä³Ð©Çé¿öÏ¿ÉÄÜ»áÔö¼ÓÆä½á¹¹Ö¸ÕëÖ¸ÏòµÄÒýÓüÆÊý£¨Èç¹ûÔÚ½øÐмÆÊý£©¡£
ÄÇô PHP Ôõô֪µÀ zval ÊÇ·ñÕýÔÚ¼ÆÊýÄØ£¿²»ÊÇËùÓеÄÊý¾ÝÀàÐͶ¼ÄÜÖªµÀ£¬ÒòΪÓÐЩÀàÐÍ£¨±ÈÈç×Ö·û´®»òÊý×飩²¢²»ÊÇ×ÜÐèÒª½øÐÐÒýÓüÆÊý¡£ËùÒÔ type_info ×ֶξÍÊÇÓÃÀ´¼Ç¼ zval ÊÇ·ñÔÚ½øÐмÆÊýµÄ£¬Õâ¸ö×ֶεÄÖµÓÐÒÔϼ¸ÖÖÇé¿ö£º
#define IS_TYPE_CONSTANT (1/* special */ #define IS_TYPE_IMMUTABLE (1/* special */ #define IS_TYPE_REFCOUNTED (1 #define IS_TYPE_COLLECTABLE (1 #define IS_TYPE_COPYABLE (1 #define IS_TYPE_SYMBOLTABLE (1/* special */ |
×¢£ºÔÚ 7.0.0 µÄÕýʽ°æ±¾ÖУ¬ÉÏÃæÕâÒ»¶Îºê¶¨ÒåµÄ×¢ÊÍÕ⼸¸öºêÊǹ© zval.u1.v.type_flags ʹÓõġ£ÕâÓ¦¸ÃÊÇ×¢Ê͵ĴíÎó£¬ÒòΪÕâ¸öÉÏÊö×Ö¶ÎÊÇ zend_uchar ÀàÐÍ¡£
type_info µÄÈý¸öÖ÷ÒªµÄÊôÐÔ¾ÍÊÇ¡º¿É¼ÆÊý¡»£¨refcounted£©¡¢¡º¿É»ØÊÕ¡»£¨collectable£©ºÍ¡º¿É¸´ÖÆ¡»£¨copyable£©¡£¼ÆÊýµÄÎÊÌâÉÏÃæÒѾÌá¹ýÁË¡£¡º¿É»ØÊÕ¡»ÓÃÓÚ±ê¼Ç zval ÊÇ·ñ²ÎÓëÑ»·£¬²»Èç×Ö·û´®Í¨³£ÊǿɼÆÊýµÄ£¬µ«ÊÇÄãȴû°ì·¨¸ø×Ö·û´®ÖÆÔìÒ»¸öÑ»·ÒýÓõÄÇé¿ö¡£
ÊÇ·ñ¿É¸´ÖÆÓÃÓÚ±íʾÔÚ¸´ÖÆÊ±ÊÇ·ñÐèÒªÔÚ¸´ÖÆÊ±ÖÆÔ죨ÔÎÄÓÃµÄ ¡°duplication¡± À´±íÊö£¬ÓÃÖÐÎıí´ï³öÀ´¿ÉÄܲ»ÊǺܺÃÀí½â£©Ò»·ÝһģһÑùµÄʵÌå¡£¡±duplication¡± ÊôÓÚÉî¶È¸´ÖÆ£¬±ÈÈçÔÚ¸´ÖÆÊý×éʱ£¬²»½ö½öÊǼòµ¥Ôö¼ÓÊý×éµÄÒýÓüÆÊý£¬¶øÊÇÖÆÔìÒ»·ÝÈ«ÐÂÖµÒ»ÑùµÄÊý×é¡£µ«ÊÇijЩÀàÐÍ£¨±ÈÈç¶ÔÏóºÍ×ÊÔ´£©¼´Ê¹ ¡°duplication¡± Ò²Ö»ÄÜÊÇÔö¼ÓÒýÓüÆÊý£¬ÕâÖÖ¾ÍÊôÓÚ²»¿É¸´ÖƵÄÀàÐÍ¡£ÕâÒ²ºÍ¶ÔÏóºÍ×ÊÔ´ÏÖÓеÄÓïÒ寥Å䣨ÏÖÓУ¬PHP7 Ò²ÊÇÕâÑù£¬²»µ¥ÊÇ PHP5£©¡£
ÏÂÃæµÄ±í¸ñÉϱêÃ÷Á˲»Í¬µÄÀàÐÍ»áʹÓÃÄÄЩ±ê¼Ç£¨x ±ê¼ÇµÄ¶¼ÊÇÓеÄÌØÐÔ£©¡£¡º¼òµ¥ÀàÐÍ¡»£¨simple types£©Ö¸µÄÊÇÕûÐÍ»ò²¼¶ûÀàÐÍÕâЩ²»Ê¹ÓÃÖ¸ÕëÖ¸ÏòÒ»¸ö½á¹¹ÌåµÄÀàÐÍ¡£Ï±íÖÐÒ²ÓСº²»¿É±ä¡»£¨immutable£©µÄ±ê¼Ç£¬ËüÓÃÀ´±ê¼Ç²»¿É±äÊý×éµÄ£¬Õâ¸öÔÚÏÂÒ»²¿·ÖÔÙÏêÊö¡£
interned string£¨±£Áô×Ö·û£©ÔÚÕâ֮ǰûÓÐÌá¹ý£¬Æäʵ¾ÍÊǺ¯ÊýÃû¡¢±äÁ¿ÃûµÈÎÞÐè¼ÆÊý¡¢²»¿ÉÖØ¸´µÄ×Ö·û´®¡£
| refcounted | collectable | copyable | immutable ----------------+------------+-------------+----------+---------- simple types | | | | string | x | | x | interned string | | | | array | x | x | x | immutable array | | | | x object | x | x | | resource | x | | | reference | x | | | |
ÒªÀí½âÕâÒ»µã£¬ÎÒÃÇ¿ÉÒÔÀ´¿´¼¸¸öÀý×Ó£¬ÕâÑù¿ÉÒÔ¸üºÃµÄÈÏʶ zval ÄÚ´æ¹ÜÀíÊÇÔõô¹¤×÷µÄ¡£
ÏÂÃæÊÇÕûÊýÐÐΪģʽ£¬ÔÚÉÏÎÄÖÐ PHP5 µÄÀý×ӵĻù´¡ÉϽøÐÐÁËһЩ¼ò»¯ £º
$a = []; // $a = zval_1(type=IS_ARRAY) -> zend_array_1(refcount=1, value=[]) $b = $a; // $a = zval_1(type=IS_ARRAY) -> zend_array_1(refcount=2, value=[]) // $b = zval_2(type=IS_ARRAY) ---^ // zval ·ÖÀëÔÚÕâÀï½øÐÐ $a[] = 1 // $a = zval_1(type=IS_ARRAY) -> zend_array_2(refcount=1, value=[1]) // $b = zval_2(type=IS_ARRAY) -> zend_array_1(refcount=1, value=[]) unset($a); // $a = zval_1(type=IS_UNDEF), zend_array_2 ±»Ïú»Ù // $b = zval_2(type=IS_ARRAY) -> zend_array_1(refcount=1, value=[])
|
Õâ¸ö¹ý³ÌÆäʵͦ¼òµ¥µÄ¡£ÏÖÔÚÕûÊý²»ÔÙÊǹ²ÏíµÄ£¬±äÁ¿Ö±½Ó¾Í»á·ÖÀë³ÉÁ½¸öµ¥¶ÀµÄ zval£¬ÓÉÓÚÏÖÔÚ zval ÊÇÄÚǶµÄËùÒÔÒ²²»ÐèÒªµ¥¶À·ÖÅäÄڴ棬ËùÒÔÕâÀïµÄ×¢ÊÍÖÐʹÓà = À´±íʾµÄ¶ø²»ÊÇÖ¸Õë·ûºÅ ->£¬unset ʱ±äÁ¿»á±»±ê¼ÇΪ IS_UNDEF¡£ÏÂÃæ¿´Ò»Ï¸ü¸´ÔÓµÄÇé¿ö£º
$a = []; // $a = zval_1(type=IS_ARRAY) -> zend_array_1(refcount=1, value=[]) $b = $a; // $a = zval_1(type=IS_ARRAY) -> zend_array_1(refcount=2, value=[]) // $b = zval_2(type=IS_ARRAY) ---^ // zval ·ÖÀëÔÚÕâÀï½øÐÐ $a[] = 1 // $a = zval_1(type=IS_ARRAY) -> zend_array_2(refcount=1, value=[1]) // $b = zval_2(type=IS_ARRAY) -> zend_array_1(refcount=1, value=[]) unset($a); // $a = zval_1(type=IS_UNDEF), zend_array_2 ±»Ïú»Ù // $b = zval_2(type=IS_ARRAY) -> zend_array_1(refcount=1, value=[])
|
ÕâÖÖÇé¿öÏÂÿ¸ö±äÁ¿±äÁ¿ÓÐÒ»¸öµ¥¶ÀµÄ zval£¬µ«ÊÇÊÇÖ¸Ïòͬһ¸ö£¨ÓÐÒýÓüÆÊý£© zend_array µÄ½á¹¹Ìå¡£ÐÞ¸ÄÆäÖÐÒ»¸öÊý×éµÄֵʱ²Å»á½øÐи´ÖÆ¡£ÕâµãºÍ PHP5 µÄÇé¿öÀàËÆ¡£
ÀàÐÍ£¨Types£©
ÎÒÃÇ´ó¸Å¿´Ò»Ï PHP7 Ö§³ÖÄÄЩÀàÐÍ£¨zval ʹÓõÄÀàÐͱê¼Ç£©£º
/* regular data types */ #define IS_UNDEF 0 #define IS_NULL 1 #define IS_FALSE 2 #define IS_TRUE 3 #define IS_LONG 4 #define IS_DOUBLE 5 #define IS_STRING 6 #define IS_ARRAY 7 #define IS_OBJECT 8 #define IS_RESOURCE 9 #define IS_REFERENCE 10 /* constant expressions */ #define IS_CONSTANT 11 #define IS_CONSTANT_AST 12 /* internal types */ #define IS_INDIRECT 15 #define IS_PTR 17 |
Õâ¸öÁбíºÍ PHP5 ʹÓõÄÀàËÆ£¬²»¹ýÔö¼ÓÁ˼¸Ï
- IS_UNDEF ÓÃÀ´±ê¼Ç֮ǰΪ NULL µÄ zval Ö¸Õ루ºÍ IS_NULL ²¢²»³åÍ»£©¡£±ÈÈçÔÚÉÏÃæµÄÀý×ÓÖÐʹÓà unset ×¢Ïú±äÁ¿£»
-
IS_BOOL ÏÖÔÚ·Ö¸î³ÉÁË IS_FALSE ºÍ IS_TRUE Á½Ïî¡£ÏÖÔÚ²¼¶ûÀàÐ͵ıê¼ÇÊÇÖ±½Ó¼Ç¼µ½ type ÖУ¬Õâô×ö¿ÉÒÔÓÅ»¯ÀàÐͼì²é¡£²»¹ýÕâ¸ö±ä»¯¶ÔÓû§ÊÇ͸Ã÷µÄ£¬»¹ÊÇÖ»ÓÐÒ»¸ö¡º²¼¶û¡»ÀàÐ͵ÄÊý¾Ý£¨PHP ½Å±¾ÖУ©¡£
-
PHP ÒýÓò»ÔÙʹÓà is_ref À´±ê¼Ç£¬¶øÊÇʹÓà IS_REFERENCE ÀàÐÍ¡£Õâ¸öÒ²Òª·Åµ½ÏÂÒ»²¿·Ö½²£»
-
IS_INDIRECT ºÍ IS_PTR ÊÇÌØÊâµÄÄÚ²¿±ê¼Ç¡£
ʵ¼ÊÉÏÉÏÃæµÄÁбíÖÐÓ¦¸Ã»¹´æÔÚÁ½¸ö fake types£¬ÕâÀïºöÂÔÁË¡£
IS_LONG ÀàÐͱíʾµÄÊÇÒ»¸ö zend_long µÄÖµ£¬¶ø²»ÊÇÔÉúµÄ C ÓïÑ﵀ long ÀàÐÍ¡£ÔÒòÊÇ Windows µÄ 64 λϵͳ£¨LLP64£©É쵀 long ÀàÐÍÖ»ÓÐ 32 λµÄλÉî¶È¡£ËùÒÔ PHP5 ÔÚ Windows ÉÏÖ»ÄÜʹÓà 32 λµÄÊý×Ö¡£PHP7 ÔÊÐíÄãÔÚ 64 λµÄ²Ù×÷ϵͳÉÏʹÓà 64 λµÄÊý×Ö£¬¼´Ê¹ÊÇÔÚ Windows ÉÏÃæÒ²¿ÉÒÔ¡£
zend_refcounted µÄÄÚÈÝ»áÔÚÏÂÒ»²¿·Ö½²¡£ÏÂÃæ¿´¿´ PHP ÒýÓõÄʵÏÖ¡£
ÒýÓÃ
PHP7 ʹÓÃÁËºÍ PHP5 ÖÐÍêÈ«²»Í¬µÄ·½·¨À´´¦Àí PHP & ·ûºÅÒýÓõÄÎÊÌ⣨Õâ¸ö¸Ä¶¯Ò²ÊÇ PHP7 ¿ª·¢¹ý³ÌÖдóÁ¿ bug µÄ¸ùÔ´£©¡£ÎÒÃÇÏÈ´Ó PHP5 ÖÐ PHP ÒýÓõÄʵÏÖ·½Ê½ËµÆð¡£
ͨ³£Çé¿öÏ£¬ дʱ¸´ÖÆÔÔòÒâζ×ŵ±ÄãÐÞ¸ÄÒ»¸ö zval ֮ǰÐèÒª¶ÔÆä½øÐзÖÀëÀ´±£Ö¤Ê¼ÖÕÐ޸ĵÄÖ»ÊÇijһ¸ö PHP ±äÁ¿µÄÖµ¡£Õâ¾ÍÊÇ´«Öµµ÷Óõĺ¬Òå¡£
µ«ÊÇʹÓà PHP ÒýÓÃʱÕâÌõ¹æÔò¾Í²»ÊÊÓÃÁË¡£Èç¹ûÒ»¸ö PHP ±äÁ¿ÊÇ PHP ÒýÓ㬾ÍÒâζ×ÅÄãÏëÒªÔÚ½«¶à¸ö PHP ±äÁ¿Ö¸Ïòͬһ¸öÖµ¡£PHP5 ÖÐµÄ is_ref ±ê¼Ç¾ÍÊÇÓÃÀ´×¢Ã÷Ò»¸ö PHP ±äÁ¿ÊDz»ÊÇ PHP ÒýÓã¬ÔÚÐÞ¸ÄʱÐè²»ÐèÒª½øÐзÖÀëµÄ¡£±ÈÈ磺
$a = []; // $a -> zval_1(type=IS_ARRAY, refcount=1, is_ref=0) -> HashTable_1(value=[]) $b =& $a; // $a, $b -> zval_1(type=IS_ARRAY, refcount=2, is_ref=1) -> HashTable_1(value=[]) $b[] = 1; // $a = $b = zval_1(type=IS_ARRAY, refcount=2, is_ref=1) -> HashTable_1(value=[1]) // ÒòΪ is_ref µÄÖµÊÇ 1, ËùÒÔ PHP ²»»á¶Ô zval ½øÐзÖÀë |
µ«ÊÇÕâ¸öÉè¼ÆµÄÒ»¸öºÜ´óµÄÎÊÌâÔÚÓÚËüÎÞ·¨ÔÚÒ»¸ö PHP ÒýÓñäÁ¿ºÍ PHP ·ÇÒýÓñäÁ¿Ö®¼ä¹²Ïíͬһ¸öÖµ¡£±ÈÈçÏÂÃæÕâÖÖÇé¿ö£º
$a = []; // $a -> zval_1(type=IS_ARRAY, refcount=1, is_ref=0) -> HashTable_1(value=[]) $b = $a; // $a, $b -> zval_1(type=IS_ARRAY, refcount=2, is_ref=0) -> HashTable_1(value=[]) $c = $b // $a, $b, $c -> zval_1(type=IS_ARRAY, refcount=3, is_ref=0) -> HashTable_1(value=[]) $d =& $c; // $a, $b -> zval_1(type=IS_ARRAY, refcount=2, is_ref=0) -> HashTable_1(value=[]) // $c, $d -> zval_1(type=IS_ARRAY, refcount=2, is_ref=1) -> HashTable_2(value=[]) // $d ÊÇ $c µÄÒýÓÃ, µ«È´²»ÊÇ $a µÄ $b, ËùÒÔÕâÀï zval »¹ÊÇÐèÒª½øÐи´ÖÆ // ÕâÑùÎÒÃǾÍÓÐÁËÁ½¸ö zval, Ò»¸ö is_ref µÄÖµÊÇ 0, Ò»¸ö is_ref µÄÖµÊÇ 1. $d[] = 1; // $a, $b -> zval_1(type=IS_ARRAY, refcount=2, is_ref=0) -> HashTable_1(value=[]) // $c, $d -> zval_1(type=IS_ARRAY, refcount=2, is_ref=1) -> HashTable_2(value=[1]) // ÒòΪÓÐÁ½¸ö·ÖÀëÁ赀 zval, $d[] = 1 µÄÓï¾ä¾Í²»»áÐÞ¸Ä $a ºÍ $b µÄÖµ. |
ÕâÖÖÐÐΪ·½Ê½Ò²µ¼ÖÂÔÚ PHP ÖÐʹÓÃÒýÓÃ±ÈÆÕͨµÄÖµÒªÂý¡£±ÈÈçÏÂÃæÕâ¸öÀý×Ó£º
$array = range(0, 1000000); $ref =& $array; var_dump(count($array)); // |
ÒòΪ count() Ö»½ÓÊÜ´«Öµµ÷Ó㬵«ÊÇ $array ÊÇÒ»¸ö PHP ÒýÓã¬ËùÒÔ count() ÔÚÖ´ÐÐ֮ǰʵ¼ÊÉÏ»áÓÐÒ»¸ö¶ÔÊý×é½øÐÐÍêÕûµÄ¸´ÖƵĹý³Ì¡£Èç¹û $array ²»ÊÇÒýÓã¬ÕâÖÖÇé¿ö¾Í²»»á·¢ÉúÁË¡£
ÏÖÔÚÎÒÃÇÀ´¿´¿´ PHP7 ÖÐ PHP ÒýÓõÄʵÏÖ¡£ÒòΪ zval ²»ÔÙµ¥¶À·ÖÅäÄڴ棬Ҳ¾Íû°ì·¨ÔÙʹÓÃºÍ PHP5 ÖÐÏàͬµÄʵÏÖÁË¡£ËùÒÔÔö¼ÓÁËÒ»¸ö IS_REFERENCE ÀàÐÍ£¬²¢ÇÒרÃÅʹÓà zend_reference À´´æ´¢ÒýÓÃÖµ£º
struct _zend_reference { zend_refcounted gc; zval val; }; |
±¾ÖÊÉÏ zend_reference Ö»ÊÇÔö¼ÓÁËÒýÓüÆÊýµÄ zval¡£ËùÓÐÒýÓñäÁ¿¶¼»á´æ´¢Ò»¸ö zval Ö¸Õë²¢ÇÒ±»±ê¼ÇΪ IS_REFERENCE¡£val ºÍÆäËûµÄ zval µÄÐÐΪһÑù£¬ÓÈÆäÊÇËüÒ²¿ÉÒÔÔÚ¹²ÏíÆäËù´æ´¢µÄ¸´ÔÓ±äÁ¿µÄÖ¸Õ룬±ÈÈçÊý×é¿ÉÒÔÔÚÒýÓñäÁ¿ºÍÖµ±äÁ¿Ö®¼ä¹²Ïí¡£
ÎÒÃÇ»¹ÊÇ¿´Àý×Ó£¬Õâ´ÎÊÇ PHP7 ÖеÄÓïÒ塣ΪÁ˼ò½àÃ÷ÁËÕâÀï²»ÔÙµ¥¶Àд³ö zval£¬Ö»Õ¹Ê¾ËüÃÇÖ¸ÏòµÄ½á¹¹Ì壺
$a = []; // $a -> zend_array_1(refcount=1, value=[]) $b =& $a; // $a, $b -> zend_reference_1(refcount=2) -> zend_array_1(refcount=1, value=[]) $b[] = 1; // $a, $b -> zend_reference_1(refcount=2) -> zend_array_1(refcount=1, value=[1]) |
ÉÏÃæµÄÀý×ÓÖнøÐÐÒýÓô«µÝʱ»á´´½¨Ò»¸ö zend_reference£¬×¢ÒâËüµÄÒýÓüÆÊýÊÇ 2£¨ÒòΪÓÐÁ½¸ö±äÁ¿ÔÚʹÓÃÕâ¸ö PHP ÒýÓã©¡£µ«ÊÇÖµ±¾ÉíµÄÒýÓüÆÊýÊÇ 1£¨ÒòΪ zend_reference Ö»ÊÇÓÐÒ»¸öÖ¸ÕëÖ¸ÏòËü£©¡£ÏÂÃæ¿´¿´ÒýÓúͷÇÒýÓûìºÏµÄÇé¿ö£º
$a = []; // $a -> zend_array_1(refcount=1, value=[]) $b = $a; // $a, $b, -> zend_array_1(refcount=2, value=[]) $c = $b // $a, $b, $c -> zend_array_1(refcount=3, value=[]) $d =& $c; // $a, $b -> zend_array_1(refcount=3, value=[]) // $c, $d -> zend_reference_1(refcount=2) ---^ // ×¢ÒâËùÓбäÁ¿¹²Ïíͬһ¸ö zend_array, ¼´Ê¹ÓеÄÊÇ PHP ÒýÓÃÓеIJ»ÊÇ $d[] = 1; // $a, $b -> zend_array_1(refcount=2, value=[]) // $c, $d -> zend_reference_1(refcount=2) -> zend_array_2(refcount=1, value=[1]) // Ö»ÓÐÔÚÕâʱ½øÐи³ÖµµÄʱºò²Å»á¶Ô zend_array ½øÐи³Öµ |
ÕâÀïºÍ PHP5 ×î´óµÄ²»Í¬¾ÍÊÇËùÓеıäÁ¿¶¼¿ÉÒÔ¹²Ïíͬһ¸öÊý×飬¼´Ê¹ÓеÄÊÇ PHP ÒýÓÃÓеIJ»ÊÇ¡£Ö»Óе±ÆäÖÐijһ²¿·Ö±»Ð޸ĵÄʱºò²Å»á¶ÔÊý×é½øÐзÖÀë¡£ÕâÒ²Òâζ×ÅʹÓà count() ʱ¼´Ê¹¸øÆä´«µÝÒ»¸öºÜ´óµÄÒýÓÃÊý×éÒ²Êǰ²È«µÄ£¬²»»áÔÙ½øÐи´ÖÆ¡£²»¹ýÒýÓÃÈÔÈ»»á±ÈÆÕͨµÄÊýÖµÂý£¬ÒòΪ´æÔÚÐèҪΪ zend_reference ½á¹¹Ìå·ÖÅäÄڴ棨¼ä½Ó£©²¢ÇÒÒýÇæ±¾Éí´¦ÀíÕâÒ»¿é¶ùÒ²²»¿ìµÄµÄÔÒò¡£
½áÓï
×ܽáһϠPHP7 ÖÐ×îÖØÒªµÄ¸Ä±ä¾ÍÊÇ zval ²»ÔÙµ¥¶À´Ó¶ÑÉÏ·ÖÅäÄÚ´æ²¢ÇÒ²»×Ô¼º´æ´¢ÒýÓüÆÊý¡£ÐèҪʹÓà zval Ö¸ÕëµÄ¸´ÔÓÀàÐÍ£¨±ÈÈç×Ö·û´®¡¢Êý×éºÍ¶ÔÏ󣩻á×Ô¼º´æ´¢ÒýÓüÆÊý¡£ÕâÑù¾Í¿ÉÒÔÓиüÉÙµÄÄÚ´æ·ÖÅä²Ù×÷¡¢¸üÉٵļä½ÓÖ¸ÕëʹÓÃÒÔ¼°¸üÉÙµÄÄÚ´æ·ÖÅä¡£
ÎÄÕµĵڶþ²¿·ÖÎÒÃÇ»áÌÖÂÛ¸´ÔÓÀàÐ͵ÄÎÊÌâ¡£ |