ÉîÈëPHPʹÓü¼ÇÉÖ®±äÁ¿
µ«Ò²ºÜÄÑά»¤~Ö¸Õë¿ÉÒÔ˵ÊÇCÓïÑÔ³ÌÐòÔ±ÐÄÍ·µÄÍ´(µ±È»Ò²ÊǸ£~^_^)¡£»¹ÓÐÒ»ÖÖ¸ü¸ß¼¶¸üÓÐЧµÄ·½·¨ÊDzÉÓÃÒýÓüÆÊý(Reference counting)¡£
¡¡¡¡ÔÚPHPÖУ¬Ò²¿ÉÒÔ²ÉÓÃÒýÓÃÀ´½â¾öÕâÑùµÄÎÊÌ⣬µ«Äã¼û¹ý²ÉÓÃÔÚPHPÖдóÁ¿Ê¹ÓÃÒýÓõÄÂð?ÏÔÈ»ºÜÉÙ¡£ ¡¡¡¡ÔÚPHPÄÚºËÖУ¬ZvalµÄʵÏÖÕýÊDzÉÓÃÁËÒýÓüÆÊýµÄ¸ÅÄ˵ÆðÒýÓüÆÊý¾Í²»µÃ²»Ì¸µ½copy-on-write »úÖÆ¡£ÕâÑùÇ°Ãæ̸µ½µÄrefcountºÍis_ref¾ÍÓÐ×÷ÓÃÁË¡£ ¡¡¡¡refcount£ºÒýÓôÎÊý¡£ÔÚzval³õʼ´´½¨µÄʱºò¾ÍΪ1¡£Ã¿Ôö¼ÓÒ»¸öÒýÓã¬Ôòrefcount ++¡£ ¡¡¡¡is_ref£ºÓÃÓÚ±íʾһ¸özvalÊÇ·ñÊÇÒýÓÃ״̬¡£zval³õʼ»¯µÄÇé¿öÏ»áÊÇ0£¬±íʾ²»ÊÇÒýÓᣠ¡¡¡¡ÔÚZend/Zend.hÄÚ²¿ÓÐһЩ¹ØÓÚZVALµÄºê¶¨Ò壬ÀïÃæ±È½ÏÇåÎúµÄ½âÎöÁËÒýÓüÆÊýµÄһЩ¹æÔò£¬ÆäÖÐÖصã¹Ø×¢ÒÔϼ¸¸öºê¶¨Òå ¡¡¡¡#define INIT_PZVAL(z) \ ¡¡¡¡(z)->refcount = 1; \ ¡¡¡¡(z)->is_ref = 0; ¡¡¡¡#define SEPARATE_ZVAL_IF_NOT_REF(ppzv) \//·ÇÒýÓÃϵıäÁ¿·ÖÀë ¡¡¡¡if (!PZVAL_IS_REF(*ppzv)) { \ ¡¡¡¡SEPARATE_ZVAL(ppzv); \ ¡¡¡¡} ¡¡¡¡#define SEPARATE_ZVAL_TO_MAKE_IS_REF(ppzv) \//·ÇÒýÓÃϵıäÁ¿·ÖÀ룬²¢ÇÒÉèÖÃÒýÓà ¡¡¡¡if (!PZVAL_IS_REF(*ppzv)) { \ ¡¡¡¡SEPARATE_ZVAL(ppzv); \ ¡¡¡¡(*(ppzv))->is_ref = 1; \ ¡¡¡¡} ¡¡¡¡#define SEPARATE_ARG_IF_REF(varptr) \ //ÒýÓÃϵıäÁ¿·ÖÀë ¡¡¡¡if (PZVAL_IS_REF(varptr)) { \ ¡¡¡¡zval *original_var = varptr; \ ¡¡¡¡ALLOC_ZVAL(varptr); \ ¡¡¡¡varptr->value = original_var->value; \ ¡¡¡¡varptr->type = original_var->type; \ ¡¡¡¡varptr->is_ref = 0; \ ¡¡¡¡varptr->refcount = 1; \ ¡¡¡¡zval_copy_ctor(varptr); \ ¡¡¡¡} else { \ ¡¡¡¡varptr->refcount++; \ ¡¡¡¡} ¡¡¡¡ÕâÀïÃæ̸µ½Á½¸öÖØÒªµÄ¸ÅÄ ¡¡¡¡1¡¢·ÇÒýÓÃϵıäÁ¿·ÖÀë¡£ ¡¡¡¡·ÇÒýÓÃϵıäÁ¿·ÖÀ룬ÊÇÖ¸ÔÚÒ»¶Ñ·ÇÒýÓñäÁ¿ÖвåÈëÒýÓõÄÇé¿öÏ£¬ÔÚPHPÄÚ²¿½øÐеÄÒ»ÖÖÄÚ´æ²Ù×÷¡£ÒÔÏÂÃæµÄÁÐ×ÓÀ´¿´£º ¡¡¡¡$a = 1; ¡¡¡¡$b = $a; ¡¡¡¡$c = &$b; ¡¡¡¡ÔÚÇ°Á½¾äÖ´ÐÐÖ®ºó£¬ÄÚ´æ½á¹¹ÈçÏÂͼ ¡¡¡¡
¡¡¡¡ÔÚµÚÈý¾ä $c = &$b;Óï¾äÖÐÔò»áÖ´ÐГ·ÇÒýÓÃϵıäÁ¿·ÖÀë¡£”£¬¾ßÌå²½ÖèÊÇ£º ¡¡¡¡½«b·ÖÀë³öÀ´£¬Í¬Ê±°Ña¶ÔÓ¦µÄzvalµÄrefcount-1¡£ ¡¡¡¡copy ³öÒ»¸öеÄzval£¬²¢°ÑzvalµÄis_refÉèÖóÉ1. ¡¡¡¡°ÑCÖ¸ÏòÕâ¸öеÄzval£¬Í¬Ê±refcount ++ ¡¡¡¡×îÖÕЧ¹ûÈçÏÂͼ£º ¡¡¡¡
¡¡¡¡2¡¢ÒýÓÃϵıäÁ¿·ÖÀë¡£ ¡¡¡¡ÒýÓÃϵıäÁ¿·ÖÀ룬ÊÇÖ¸ÔÚÒ»¶ÑÒýÓñäÁ¿ÖнøÐÐÒ»¸ö·ÇÒýÓø³Öµ²Ù×÷£¬Õâ¸öʱºò»áÖ±½ÓÖ´ÐÐcopyÄÚ´æµÄ²Ù×÷¡£ ¡¡¡¡ÒÔÏÂÃæµÄÀý×ÓÀ´Ëµ ¡¡¡¡$a = 1; ¡¡¡¡$b = &$a; ¡¡¡¡$c = $b; ¡¡¡¡ÔÚÖ´ÐÐÍêÇ°Á½Ðкó£¬PHPÖÐÄÚ´æ½á¹¹ÈçÏ£º ¡¡¡¡
¡¡¡¡ÔÚµÚÈý¾ä£¬Ôò»áÖ´ÐГÒýÓÃϵıäÁ¿·ÖÀë”Ò²¾ÍÊÇÕæÕýµÄcopy£¬×îÖÕÄÚ´æ½á¹¹ÈçÏÂͼ ¡¡¡¡
¡¡¡¡¾Ý´Ë£¬»ù±¾É϶ÔPHP±äÁ¿ÄÚ²¿µÄһЩÔÀí±È½ÏÇå³þÁË£¬µ«»¹ÓÐһЩÐèҪעÒâµãµÄ£º ¡¡¡¡1¡¢PHP±äÁ¿µÄÒýÓüÆÊýÌØÐÔ£¬¶ÔÓÚÊý×éͬÑùÒ²´æÔÚ¡£µ«×¢Ò⣬¶ÔÓÚkeyÔò²»ÉúЧ¡£(¾ßÌåÔÚºóÃæÕ½ڻá·ÖÎöµ½¡£) ¡¡¡¡2¡¢PHP±äÁ¿ÖеĶÔÏó±È½ÏÌØÊ⣬ÔÚPHP5Ö®ºó£¬Ä¬È϶¼ÊDzÉÓÃÒýÓø³ÖµµÄ·½Ê½¡£¾ßÌåʵÏÖ¿ÉÒԲο¼Zend_objects.*ϵÁдúÂë¡£ ¡¡¡¡3¡¢¶ÔÓÚ·ÖÎöPHPÄÚ²¿±äÁ¿£¬ÍƼö²ÉÓÃxdebug_debug_zval£¬¶ø²»Òª²ÉÓÃÄÚÖõÄdebug_zval_dump¡£ÒòΪPHPÄÚÖõÄdebug_zval_dumpº¯ÊýÒ»·½ÃæÎÞ·¨´¦Àíis_ref£¬¶øÇÒ²ÉÓÃÁËÒýÓõķ½Ê½À´´¦Àí£¬´Ó¶øµ¼Ö¿´µ½½á¹û»áÓÐÎó½â¡£ ¡¡¡¡Ê¹Óü¼ÇɽáÂÛ ¡¡¡¡¾Ý´Ë¿ÉÒԵóö·ÖÎö³ö²»ÉÙ½áÂÛ£º ¡¡¡¡1¡¢ÔÚPHP¿ª·¢Öв»ÍƼö²ÉÓÃÒý |
ÁèÖڿƼ¼×¨ÒµÌṩ·þÎñÆ÷×âÓᢷþÎñÆ÷Íйܡ¢ÆóÒµÓʾ֡¢ÐéÄâÖ÷»úµÈ·þÎñ£¬¹«Ë¾ÍøÕ¾£ºhttp://www.lingzhong.cn ΪÁ˸ø¹ã´ó¿Í»§Á˽â¸ü¶àµÄ¼¼ÊõÐÅÏ¢£¬±¾¼¼ÊõÎÄÕÂÊÕ¼¯À´Ô´ÓÚÍøÂç,ÁèÖڿƼ¼×ðÖØÎÄÕÂ×÷ÕߵİæȨ£¬Èç¹ûÓÐÉæ¼°ÄãµÄ°æȨÓбØҪɾ³ýÄãµÄÎÄÕ£¬ÇëºÍÎÒÃÇÁªÏµ¡£ÒÔÉÏÐÅÏ¢ÓëÎÄÕÂÕýÎÄÊDz»¿É·Ö¸îµÄÒ»²¿·Ö,Èç¹ûÄúҪתÔر¾ÎÄÕÂ,Çë±£ÁôÒÔÉÏÐÅÏ¢£¬Ð»Ð»! |