ãã®èšäºã¯ãç§ãçŸåšãã·ã¢èªã«ç¿»èš³ããŠãã
PHP Internals Bookã® Zvalsç« ã«åºã¥ããŠããŸã[
1 ]ã ãã®æ¬ã®äž»ãªç®çã¯ãPHPã®æ¡åŒµæ©èœãäœæãããCããã°ã©ããŒã§ãããã€ã³ã¿ãŒããªã¿ãŒã®å
éšããžãã¯ã«ã€ããŠèª¬æããŠããã®ã§ãPHPéçºè
ã«ãšã£ãŠåœ¹ç«ã€ãšç¢ºä¿¡ããŠããŸãã ãã®èšäºã§ã¯ãåºæ¬çãªçè«ã®ã¿ãæ®ããŸããããããã¯ãã¹ãŠã®éçºè
ã«æãããªã¯ãã§ãïŒPHPãCã«ã粟éããŠããŸããïŒã è³æã®ããå®å
šãªãã¬ãŒã³ããŒã·ã§ã³ã«ã€ããŠã¯ãæ¬ãåç
§ããŠãã ããã
ã¿ã¹ã¯ã¯æ³šæãåŒãããšã§ãã 次ã®ã³ãŒããå®è¡ããçµæã¯ã©ããªããŸããïŒ
$obj1 = new StdClass(); $obj2 = new StdClass(); $obj1->value = 1; $obj2->value = 1; function f1($o) { $o = 100; } function f2($o) { $o->value = 100; } f1($obj1); f2($obj2); var_dump($obj1); var_dump($obj2);
çããªããžã§ã¯ãïŒstdClassïŒïŒ1ïŒ1ïŒ{["value"] => intïŒ1ïŒ}
ãªããžã§ã¯ãïŒstdClassïŒïŒ2ïŒ1ïŒ{["value"] => intïŒ100ïŒ}
çããæ£ç¢ºã«å®çŸ©ãããã®çç±ã説æã§ããå Žåã¯ããããããã®èšäºããæ°ããããšãåŠã¶ããšã¯ãªãã§ãããããããªããã°ããã®èšäºãèªãã§ç¥èãæ·±ããŠãã ããã
åºæ¬æ§é
PHPã®åºæ¬çãªããŒã¿æ§é ã¯zvalïŒãZend valueãã®ç¥ïŒã§ãã åzvalã¯ããèªäœã«ããã€ãã®ãã£ãŒã«ããæ ŒçŽãããã®ãã¡ã®2ã€ã¯ãã®å€ã®å€ãšã¿ã€ãã§ãã PHPã¯åçåä»ãèšèªã§ããããããã£ãŠå€æ°ã®åã¯ã³ã³ãã€ã«æã§ã¯ãªãå®è¡æã«ã®ã¿èªèãããããããããå¿
èŠã§ãã ããã«ãå€æ°ã®åã¯zvalã®æå¹æéäžã«å€æŽã§ããŸããã€ãŸãã以åã«æŽæ°ãšããŠä¿åãããŠããzvalã¯åŸã§æååãå«ãããšãã§ããŸãã
å€æ°ã®åã¯æŽæ°ã©ãã«ïŒåã¿ã°ã笊å·ãªãæåïŒãšããŠä¿åãããŸãã ã©ãã«ã¯ãPHPã§äœ¿çšå¯èœãª8ã€ã®ããŒã¿åã«å¯Ÿå¿ãã8ã€ã®å€ã®ãããããåãããšãã§ããŸãã ãããã®å€ã¯ã
IS_TYPE
圢åŒã®å®æ°ã䜿çšããŠå²ãåœãŠãå¿
èŠããããŸãã ããšãã°ã
IS_NULL
ã¯NULLããŒã¿åã«
IS_STRING
ãã
IS_STRING
ã¯æååã«
IS_STRING
ããŸãã
zvalue_value
å€æ°ã®å®éã®å€ã¯ã次ã®ããã«å®çŸ©ããããŠããªã³ããŒã¿åïŒããŠããªã³ãã以äžã§ã¯ãŠããªã³ãŸãã¯ãŠããªã³ãšããçšèªã䜿çšããŸãïŒã«æ ŒçŽãããŸãã
typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } zvalue_value;
çµåã®æŠå¿µã«ç²ŸéããŠããªã人ã®ããã®å°ããªèª¬æã Unionã¯ãããŸããŸãªã¿ã€ãã®è€æ°ã®ããŒã¿ã¡ã³ããŒãå®çŸ©ããŸããããŠããªã³ã§å®çŸ©ãããå€ããã¯åžžã«1ã€ã®å€ãã䜿çšã§ããŸããã ããšãã°ã
value.lval
ãããŒã¿ã¡ã³ããŒ
value.lval
ã«å²ãåœãŠãããå Žåã
value.lval
ã®ã¿ã䜿çšããŠããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸããä»ã®ããŒã¿ã¡ã³ããŒãžã®ã¢ã¯ã»ã¹ã¯åãå
¥ãããããããã°ã©ã ã®äºæããªãåäœã«ã€ãªããå¯èœæ§ããããŸãã ããã¯ããŠããªã³ããã¹ãŠã®ã¡ã³ããŒã®ããŒã¿ãåãã¡ã¢ãªé åã«ä¿åããã¢ã¯ã»ã¹ããŠããååã«åºã¥ããŠå€ãç°ãªãæ¹æ³ã§è§£éããããã§ãã ãŠããªã³ã«å²ãåœãŠãããã¡ã¢ãªã®ãµã€ãºã¯ããã®æ倧ããŒã¿ã¡ã³ããŒã®ãµã€ãºã«å¯Ÿå¿ããŸãã
zval-sã䜿çšããå Žåãç¹å¥ãªã¿ã°ïŒã¿ã€ãã¿ã°ïŒã䜿çšãããŸããããã«ãããçŸåšãŠããªã³ã«æ ŒçŽãããŠããããŒã¿ã®ã¿ã€ããå€å¥ã§ããŸãã APIã«ç§»ãåã«ãPHPã§ãµããŒããããŠããããŒã¿åãšãã®ä¿åæ¹æ³ã確èªããŸãããã
æãåçŽãªããŒã¿åã¯
IS_NULL
ã§ã
IS_NULL
ã§ãããããå€ãæ ŒçŽããªãã§ãã ããã
æ°å€ãæ ŒçŽããããã«ãPHPã¯2ã€ã®ã¿ã€ããè¡šããŸãïŒ
IS_LONG
ããã³
IS_DOUBLE
ã§
double dval
ãããã
long lval
ããã³
double dval
䜿çšããŸãã æåã¯æŽæ°ãä¿åããããã«äœ¿çšããã2çªç®ã¯æµ®åå°æ°ç¹æ°ã®ããã«äœ¿çšãããŸãã
longããŒã¿åã«ã€ããŠç¥ã£ãŠããã¹ãããšãããã€ããããŸãã ãŸãã笊å·ä»ãæŽæ°ã§ããã€ãŸããæ£ã®å€ãšè² ã®å€ãå«ãããšãã§ããŸããããã®ããŒã¿åã¯ãããæŒç®ã«ã¯é©ããŠããŸããã 次ã«ãlongã¯ãã©ãããã©ãŒã ããšã«ãµã€ãºãç°ãªããŸãã32ãããã·ã¹ãã ã§ã¯ãµã€ãºã32ããããŸãã¯4ãã€ãã§ããã64ãããã·ã¹ãã ã§ã¯ãµã€ãºã4ãŸãã¯8ãã€ãã«ãªããŸãã Unixã·ã¹ãã ã§ã¯éåžž8ãã€ãã®ãµã€ãºã§ããã64ãããããŒãžã§ã³ã®Windowsã§ã¯4ãã€ããã䜿çšããŸããã
ãã®ãããlongåã®ç¹å®ã®å€ã«äŸåããªãã§ãã ããã longããŒã¿åã«æ ŒçŽã§ããæå°å€ãšæ倧å€ã¯ã
LONG_MIN
ããã³
LONG_MAX
ã§äœ¿çšã§ãããã®åã®ãµã€ãºã¯
SIZEOF_LONG
ãã¯ãã䜿çšããŠæ±ºå®ã§ããŸãïŒ
sizeof(long)
ãšã¯ç°ãªãããã®ãã¯ãã¯
#if
ãã£ã¬ã¯ãã£ãã§ã䜿çšã§ããŸãïŒã
double
ããŒã¿åã¯ãæµ®åå°æ°ç¹æ°ãæ ŒçŽããããã®ãã®ã§ãããéåžžIEEE-754ä»æ§ã«åŸã£ãŠã8ãã€ãã®ãµã€ãºãæã£ãŠããŸãã ãã®åœ¢åŒã®è©³çŽ°ã«ã€ããŠã¯ããã§ã¯èª¬æããŸããããå°ãªããšããã®åã®ç²ŸåºŠã¯å¶éãããŠãããå€ãã®å ŽåãæåŸ
ããŠããå€ãæ£ç¢ºã«ä¿åããªãããšã«æ³šæããŠãã ããã
ããŒã«å€æ°ã¯
IS_BOOL
ãã©ã°ã䜿çšããå€
0
ïŒåœïŒããã³
1
ïŒçïŒãšããŠ
long val
ãã£ãŒã«ãã«æ ŒçŽãããŸãã 2ã€ã®å€ã®ã¿ããã®åã䜿çšãããããçè«çã«ã¯ããå°ããåïŒããšãã°ãzend_boolïŒã䜿çšããŠãååã§ãããzvalue_valueã¯ãŠããªã³ã§ãããæ倧ããŒã¿ã¡ã³ããŒã«å¯Ÿå¿ããã¡ã¢ãªãµã€ãºãå²ãåœãŠãããããã³ã³ãã¯ããªå€æ°ãé©çšããŸãããŒã«å€ã®å Žåãã¡ã¢ãªã¯ç¯çŽãããŸããã ãããã£ãŠããã®å Žåã¯lvalãåå©çšãããŸãã
è¡ïŒ
IS_STRING
ïŒã¯ãæ§é
struct {char *val; int len; } str;
struct {char *val; int len; } str;
ã€ãŸããæååã¯ãæåå
char *
ããã³æåå
int
æŽæ°é·ãžã®ãã€ã³ã¿ãšããŠæ ŒçŽãããŸãã PHPã®æååã¯ãNULãã€ãïŒ\ 0ïŒãå«ãããšãã§ãããã€ããªã»ãŒãã§ããããã«ãé·ããæ瀺çã«ä¿åããå¿
èŠããããŸãã ãã ããããã«ãããããããPHPã§äœ¿çšãããæååã¯ãæååã®é·ãã®åŒæ°ããšããªãã©ã€ãã©ãªé¢æ°ãšã®äºææ§ã確ä¿ããããã«ãNULã§çµäºãããã€ãã§çµäºããŸãããæååã®æåŸã«nullãã€ããèŠã€ãããšæ³å®ããŠããŸã ãã¡ããããã®ãããªå Žåãæååã¯ãã€ããªã»ãŒãã§ã¯ãªããªãããŒããã€ããæåã«çŸãããŸã§åãæšãŠãããŸãã ããšãã°ãå€ãã®ãã¡ã€ã«ã·ã¹ãã é¢é£ã®é¢æ°ãšlibcã®ã»ãšãã©ã®æååé¢æ°ã¯åæ§ã«åäœããŸãã
æååã®é·ãã¯ïŒUnicodeæåã®æ°ã§ã¯ãªãïŒãã€ãåäœã§æž¬å®ããããŒããã€ããå«ãã¹ãã§ã¯ãããŸãããã€ãŸããæåå
foo
é·ãã¯ãæ ŒçŽã«4ãã€ãã䜿çšãããã«ãããããã3ã§ãã
sizeof
ã䜿çšããŠæååã®é·ãã決å®ããå Žåã1ãæžç®ããå¿
èŠããããŸãïŒ
strlen("foo") == sizeof("foo") - 1
ã
ç解ããããšãéåžžã«éèŠã§ããæååã®é·ãã¯ãlongåãŸãã¯ä»ã®é¡äŒŒã®åã§ã¯ãªããintåã«æ ŒçŽãããŸãã ããã¯ãæååã®é·ãã2147483647ãã€ãïŒ2ã®ã¬ãã€ãïŒã«å¶éããæŽå²çãªã¢ãŒãã£ãã¡ã¯ãã§ãã ãã倧ããªè¡ã¯ããªãŒããŒãããŒãåŒãèµ·ãããŸãïŒé·ããè² ã«ãªããŸãïŒã
æ®ãã®3ã€ã®ã¿ã€ãã¯ãè¡šé¢çã«ã®ã¿èšåãããŸãã
é
åã¯
IS_ARRAY
ã©ãã«ã䜿çšãã
HashTable *ht
ããŒã¿
HashTable *ht
æ ŒçŽãããŸãã HashTableããŒã¿æ§é ã®ä»çµã¿ã«ã€ããŠã¯ãå¥ã®èšäºã§èª¬æããŠããŸãã
ãªããžã§ã¯ãïŒ
IS_OBJECT
ïŒã¯
zend_object_value obj
ããŒã¿
zend_object_value obj
䜿çšããŸããããã¯ãããªããžã§ã¯ããã³ãã«ãïŒå®éã®ããŒã¿ã®æ€çŽ¢ã«äœ¿çšãããæŽæ°IDïŒãšããªããžã§ã¯ãã®åäœã決å®ããããªããžã§ã¯ããã³ãã©ãŒãã®ã»ããã§æ§æãããŸãã PHPã®ã¯ã©ã¹ãšãªããžã§ã¯ãã®ã·ã¹ãã ã«ã€ããŠã¯ããã¯ã©ã¹ãšãªããžã§ã¯ããã®ç« ã§èª¬æããŸãã
ãªãœãŒã¹ïŒ
IS_RESOURCE
ïŒã¯ãå€ã®æ€çŽ¢ã«äœ¿çšãããäžæã®IDãæ ŒçŽããããããªããžã§ã¯ãã«äŒŒãŠããŸãã ãã®IDã¯ãé·ãlvalã¡ã³ããŒã«ä¿åãããŸãã ãªãœãŒã¹ã«ã€ããŠã¯ããŸã æžãããŠããªã察å¿ããç« ã§èª¬æããŸãã
å°èšãèŠçŽãããšã䜿çšå¯èœãªãã¹ãŠã®ã¿ã€ãã©ãã«ãšããã«å¯Ÿå¿ããå€ã¹ãã¢ããªã¹ãããè¡šã以äžã«ãããŸãã
ã¿ã€ãã¿ã° | ä¿ç®¡å Žæ |
IS_NULL | none |
IS_BOOL | long lval |
IS_LONG | long lval |
IS_DOUBLE | double dval |
IS_STRING | struct { char *val; int len; } str |
IS_ARRAY | HashTable *ht |
IS_OBJECT | zend_object_value obj |
IS_RESOURCE | long lval |
zval
次ã«ãzvalããŒã¿æ§é ãã©ã®ããã«èŠããããèŠãŠã¿ãŸãããã
typedef struct _zval_struct { zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; } zval;
æ¢ã«è¿°ã¹ãããã«ãzvalã«ã¯å€ãšãã®åãæ ŒçŽããããã®ã¡ã³ããŒãå«ãŸããŠããŸãã å€ã¯ãäžèšã®zvalue_valueãŠããªã³ã«æ ŒçŽãããŸãã ã¿ã€ãã¯
zend_uchar type
ä¿åãããŸãã ããã«ããã®æ§é ã«ã¯ãååã
__gc
ã§çµãã2ã€ã®è¿œå ã®ããããã£ãå«ãŸããŠããŸãããããã®ããããã£ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¡ã«ããºã ã«ãã£ãŠäœ¿çšãããŸãã ãããã®ããããã£ã«ã€ããŠã¯ã次ã®ã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãã
ã¡ã¢ãªç®¡ç
zvalããŒã¿æ§é ã¯2ã€ã®åœ¹å²ãæãããŸãã ãŸããåã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«ãããŒã¿ãšãã®ã¿ã€ããä¿åããŸãã 第äºã«ïŒããã«ã€ããŠã¯çŸåšã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãïŒãã¡ã¢ãªå
ã®å€ãå¹ççã«ç®¡çããããã«äœ¿çšãããŸãã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ããªã³ã¯ã«ãŠã³ããšã³ããŒãªã³ã©ã€ãã®æŠå¿µã«ã€ããŠèª¬æããŸãã
å€ãšåç
§ã®ã»ãã³ãã£ã¯ã¹
PHPã§ã¯ãåç
§ã®äœ¿çšãæ瀺çã«èŠæ±ããªãéãããã¹ãŠã®å€ã«ã¯åžžã«å€ã®ã»ãã³ãã£ã¯ã¹ããããŸãã ããã¯ãé¢æ°ã«å€ãæž¡ããšããããã³å²ãåœãŠæäœäžã«ãå€ã®2ã€ã®ç°ãªãã³ããŒã§äœæ¥ããããšãæå³ããŸãã ããã確èªããã®ã«åœ¹ç«ã€äŸãããã€ããããŸãã
<?php $a = 1; $b = $a; $a++;
äžèšã®äŸã¯éåžžã«åçŽã§æçœã§ãããããã¯ããããå Žæã«é©çšãããåºæ¬çãªã«ãŒã«ã§ããããšãç解ããããšãéèŠã§ãã ãªããžã§ã¯ãã«ãé©çšãããŸãïŒ
<?php $obj = (object) ['value' => 1]; function fnByVal($val) {
PHP 5ã§ã¯ããªããžã§ã¯ãã¯åç
§ã«ãã£ãŠèªåçã«æž¡ãããããšããããããŸãããäžèšã®äŸã¯ããã§ã¯ãªãããšã瀺ããŠããŸãã å€ãæž¡ãããé¢æ°ã¯ãæž¡ãããå€æ°ã®å€ãå€æŽã§ããŸããããªã³ã¯ãæž¡ãããé¢æ°ã®ã¿ããããè¡ãããšãã§ããŸãã
ãªããžã§ã¯ãã¯åç
§æž¡ãããããã®ããã«åäœããŸãããããã¯äºå®ã§ãã å€æ°ã«ç°ãªãå€ãå²ãåœãŠãããšã¯ã§ããŸãããããªããžã§ã¯ãã®ããããã£ãå€æŽããããšã¯ã§ããŸãã ããã¯ããªããžã§ã¯ãã®å€ããªããžã§ã¯ãã®ãå®éã®ããŒã¿ãã®æ€çŽ¢ã«äœ¿çšãããIDã§ããããå¯èœã§ãã å€æž¡ãã®ã»ãã³ãã£ã¯ã¹ã§ã¯ããã®IDãå¥ã®IDã«å€æŽããããå€æ°ã®åãå€æŽãããããããšã¯ã§ããŸãããããªããžã§ã¯ãã®ãå®éã®ããŒã¿ããå€æŽããããšã¯ã§ããŸããã
äžèšã®äŸãå°ãå€æŽããŠã¿ãŸãããã
<?php $obj = (object) ['value' => 1]; function fnByVal($val) {
ãªãœãŒã¹ã«ã€ããŠããããŒã¿ã®æ€çŽ¢ã«äœ¿çšã§ããIDã®ã¿ãä¿åããããããåãããšãèšããŸãã ãããã£ãŠãå€æž¡ãã®ã»ãã³ãã£ã¯ã¹ã§ã¯ãzvalã®IDãŸãã¯ã¿ã€ããå€æŽããããšã¯ã§ããŸãããããªãœãŒã¹ããŒã¿ãå€æŽããããšã¯ã§ããŸããïŒããšãã°ããã¡ã€ã«å
ã®äœçœ®ãã·ããããããïŒã
ãªã³ã¯ã«ãŠã³ããšã³ããŒãªã³ã©ã€ã
äžèšã®å
容ã«ã€ããŠå°ãèãããšãPHPã¯èšå€§ãªæ°ã®ã³ããŒæäœãå®è¡ããå¿
èŠããããšããçµè«ã«éããã§ãããã é¢æ°ã«å€æ°ãæž¡ããã³ã«ããã®å€ãã³ããŒããå¿
èŠããããŸãã ããã¯æŽæ°åãŸãã¯å粟床åã®ããŒã¿ã§ã¯åé¡ã«ãªããªããããããŸãããã1000äžåã®å€ãå«ãé
åãé¢æ°ã«æž¡ããšæ³åããŠãã ããã é¢æ°ãåŒã³åºããããã³ã«äœçŸäžãã®å€ãã³ããŒãããšã蚱容ã§ããªãã»ã©é
ããªããŸãã
ãããé¿ããããã«ãPHPã¯ã³ããŒãªã³ã©ã€ããã©ãã€ã ã䜿çšããŸãã Zvalã¯å€ãã®å€æ°/é¢æ°/ãªã©ã§å
±æã§ããŸãããèªã¿åãã«zvalããŒã¿ã䜿çšãããŠããå Žåã«éããŸãã 誰ããzvalããŒã¿ãå€æŽããããšæããšããã«ãå€æŽãé©çšãããåã«ã³ããŒãããŸãã
1ã€ã®zvalãè€æ°ã®å Žæã§äœ¿çšã§ãããããPHPã¯ç¬éãå€æã§ããã¯ãã§ãã誰ãzvalã³ãŒãã䜿çšããŠãããåé€ããŸããïŒå æããŠããã¡ã¢ãªã解æŸããŸãïŒã PHPã¯ãããåçŽãªåç
§ã«ãŠã³ãã«ããŸãã ããã§ã®ããªã³ã¯ãã¯PHPïŒ
&
æå®ããããªã³ã¯ïŒã§ã¯ãªãã誰ãïŒå€æ°ãé¢æ°ãªã©ïŒããã®zvalã䜿çšããŠããããšã瀺ãã€ã³ãžã±ãŒã¿ãŒã«ãããªãããšã«æ³šæããŠãã ããã ãã®ãããªãªã³ã¯ã®æ°ã¯
refcount
ãšåŒã°ãã
refcount__gc
zvalã®ããŒã¿ã¡ã³ããŒã«æ ŒçŽãããŸãã
ãããã©ã®ããã«æ©èœããããç解ããããã«ãäŸãèŠãŠã¿ãŸãããã
<?php $a = 1;
ããã§ã®ããžãã¯ã¯åçŽã§ãïŒãªã³ã¯ãè¿œå ããããšã
refcount
ã®å€ã1ã€å¢å ãããªã³ã¯ãåé€ããããšã
refcount
æžå°ããŸãã
refcount
ã®å€ã0ã«éãããšãzvalãåé€ãããŸãã
確ãã«ããã®ã¡ãœããã¯åŸªç°åç
§ã®å Žåã«ã¯æ©èœããŸããã
<?php $a = [];
äžèšã®ã³ãŒããèµ·åããããšã2ã€ã®zvalãå€æ°ãä»ããŠã¢ã¯ã»ã¹ã§ããªããªããŸããããããã¯çžäºã«åç
§ãããããã¡ã¢ãªå
ã«ãŸã ååšããç¶æ³ã«ãªããŸãã ããã¯ããªã³ã¯ã«ãŠã³ãã®åé¡ã®å
žåçãªäŸã§ãã
ãã®åé¡ã解決ããããã«ãPHPã«ã¯å¥ã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¡ã«ããºã -埪ç°ã³ã¬ã¯ã¿ãŒããããŸãã 埪ç°ã³ã¬ã¯ã¿ãŒã¯ïŒãªã³ã¯ã«ãŠã³ãã¡ã«ããºã ãšã¯ç°ãªãïŒPHPæ¡åŒµæ©èœã®éçºè
ã«å¯ŸããŠééçã§ããããããããç¡èŠã§ããŸãã ãã®ãããã¯ã«èå³ãããå Žåã¯ããã®ã¢ã«ãŽãªãºã ã«ã€ããŠèª¬æããŠããPHPããã¥ã¡ã³ããåç
§ããŠãã ããã
PHPãªã³ã¯ã®å¥ã®æ©èœïŒäžèšã§èª¬æãããã®ã§ã¯ãªã
&$var
ãšããŠå®çŸ©ãããŠãããã®ïŒãæ€èšããå¿
èŠããããŸãã zvalãPHPãªã³ã¯ãšããŠäœ¿çšãããããšã瀺ãããã«ã
is_ref__gc
ãã©ã°ãzvalæ§é äœã§
is_ref__gc
ããŸãã
is_ref=1
å Žåãããã¯å€æŽåã«zvalãã³ããŒããŠã¯ãªããªããšããã·ã°ãã«ã§ããã代ããã«zvalå€ãå€æŽããå¿
èŠããããŸãã
<?php $a = 1;
äžèšã®äŸã§ã¯ããªã³ã¯ãäœæããåã«ãå€æ°
$a
ã®
refcount=1
ãèšå®ãããŠããŸãã 次ã«ãè€æ°ã®ãªã³ã¯ã«ãŠã³ããæã€åæ§ã®äŸãèããŠã¿ãŸãããã
<?php $a = 1;
ã芧ã®ãšããã
is_ref=0
ãžã®ãªã³ã¯ãäœæãããšããc
is_ref=0
ããã³
refcount>1
ã¯ã³ããŒãå¿
èŠã§ãã åæ§ã«ãå€æž¡ãã®ã³ã³ããã¹ãã§
is_ref=1
ããã³
refcount>1
ã§zvalã䜿çšããå Žåãã³ããŒæäœãå¿
èŠã§ãã ãã®ãããPHPãªã³ã¯ã䜿çšãããšãéåžžã³ãŒããé
ããªããŸãã PHPã®ã»ãšãã©ãã¹ãŠã®é¢æ°ã¯ãå€æž¡ãã®ã»ãã³ãã£ã¯ã¹ã䜿çšãããããå€
is_ref=1
zvalãååŸãããšãã«ã³ããŒãäœæããŸãã
ãããã«
ãã®èšäºã§ã¯ãPHP Internals Bookã®Zvalsã®ç« ãçµããŸããã PHPéçºè
ã«åœ¹ç«ã€è³æã®ã¿ãæ®ããŠãæ¡åŒµæ©èœã®éçºã«é¢é£ããå€ãã®ããã¹ããã«ããããããšããŸããïŒããããªããšãèšäºã®éã3åã«ãªããŸãïŒã PHPã®æ¡åŒµæ©èœã®éçºã®åé¡ãããã«è©³ãã調ã¹ãããšã«èå³ãããå Žåã¯ã
æ¬ãŸãã¯
ç§ã®ç¿»èš³ãåç
§ããŠãã ããã çŸæç¹ã§ã¯ãZvalsã®ãããã®ã¿ã翻蚳ãããŠããŸãããç§ã¯ä»äºãç¶ããŠããŸãã è¿ãå°æ¥ãããã·ã¥ããŒãã«ãšã¯ã©ã¹ã«é¢ããèå³æ·±ãç« ãåãäžããŸãã
[
1 ]æ¬ã®ç¿»èš³ã¯èè
ã®èš±å¯ãåŸãŠè¡ãããŠããŸãããéå
¬åŒã§ãã ããã§ç§ã®ç¿»èš³ã
èªãããšãã§ããŸãïŒ
romka.gitbooks.io/php-internals-book-ru ãããã§ç¿»èš³ãå©ããïŒ
github.com/romka/phpinternalsbook-ru