Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
±äÁ¿ÔÚ PHP7 ÄÚ²¿µÄʵÏÖ£¨Ò»£©
 
À´Ô´£º²®ÀÖÔÚÏß ·¢²¼ÓÚ 2016-1-4
  2736  次浏览      27
 

±¾ÎĵÚÒ»²¿·ÖºÍµÚ¶þ¾ù·­Òë×Ô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 Ö¸ÕëµÄ¸´ÔÓÀàÐÍ£¨±ÈÈç×Ö·û´®¡¢Êý×éºÍ¶ÔÏ󣩻á×Ô¼º´æ´¢ÒýÓüÆÊý¡£ÕâÑù¾Í¿ÉÒÔÓиüÉÙµÄÄÚ´æ·ÖÅä²Ù×÷¡¢¸üÉٵļä½ÓÖ¸ÕëʹÓÃÒÔ¼°¸üÉÙµÄÄÚ´æ·ÖÅä¡£

ÎÄÕµĵڶþ²¿·ÖÎÒÃÇ»áÌÖÂÛ¸´ÔÓÀàÐ͵ÄÎÊÌâ¡£

   
2736 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢