
рд╢рд╛рдо рд╣реЛ рдЪреБрдХреА рдереА, рдХреБрдЫ рдХрд░рдиреЗ рдХреЛ рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ PHP рдореЗрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЫрд╛рдВрдЯрдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реИрдВред
рдорд╛рд╕реНрдЯрд░ рдмреНрд░рд╛рдВрдЪ рдХреЗ рд╕реВрддреНрд░ (рдпрд╣ рдЕрдм 8 рдХреЗ рд╕рд╛рде 7.4 рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рд╣реИ)
Php рд╕реЗ opcode рдЬрдирд░реЗрдЯрд░ 7.3.0ред
7.3.6 рдкрд░ рдорд╛рдк рдХрд┐рдП рдЧрдП рдереЗред
рдирд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрд╡реАрдХрд░рдг: рдиреИрдиреЛрд╕реЗрдХрдВрдбреНрд╕ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░реЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ "рдкреЙрд▓реАрдмрд┐рдХрд▓" рдирд╛рдордХ рдПрдХ рдРрд╕реА рдкреЛрд▓рд┐рдорд┐рдХрд▓ рдЯреНрд░рд┐рдХ рд╣реИред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджрд╕рд┐рдпреЛрдВ рдпрд╛ рд╕реИрдХрдбрд╝реЛрдВ рдиреИрдиреЛрд╕реЗрдХрдВрдб рдФрд░ рд╣рдЬрд╛рд░реЛрдВ рдЙрдкрд╛рдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ рдХрд┐ рдЙрди рдкрд░ рдмрдЪрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рд╣реИред
рд╕рдВрдХрд▓рди рдордВрдЪ
foreach ,
for рдФрд░
do рднрд╛рд╖рд╛ рдХреЗ рдХреАрд╡рд░реНрдб рд╣реИрдВ, рдЬрдмрдХрд┐
array_ * рдлрд╝рдВрдХреНрд╢рди рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, ceteris paribus, рдкрд╣рд▓реЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░, parser рдиреИрдиреЛрд╕реЗрдХрдВрдб рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рддреЗрдЬреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред
рдкрд╛рд░реНрд╕рд░
рдмрдпрд╛рди рдЯреЛрдХрди рддрдХ, рдкрде рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧрд╛
start -> top_statement_list -> top_statement -> statement
рд▓реВрдкреНрд╕ рдХреЛ
рдмрдпрд╛рди рд╕реНрддрд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
->T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement ->T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement ->T_FOREACH '(' expr T_AS foreach_variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement ->T_DO statement T_WHILE '(' expr ')' ';' ->T_WHILE '(' expr ')' while_statement
For_exprs рдФрд░ рдмрд╕
expr рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдПрдХ рдХреЗ рд▓рд┐рдП, рдХрдИ
expr рд▓рд┐рдЦрдиреЗ
рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХреА рдЧрдИ рд╣реИред
foreach_variable рдПрдХ рдРрд╕рд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓
рдЪрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рд╕реВрдЪреА рдпрд╛
[] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдШрдЯрди рдХреЛ рднреА рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред
for_statement ,
foreach_statement ,
рдЬрдмрдХрд┐_ statement рдорд╛рдирдХ
рдХрдерди рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
foreach($array as $element):
рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдмрд╣реБрдд рдЧрд╣рд░рд╛ рджрдлрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
-> expr -> variable -> callable_variable -> function_call -> name argument_list
callable_variable , рд╣рдореНрдо ... рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ, рд╣реИ рдирд╛? :)
рдЪрд▓реЛ opcodes рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рдФрд░ рдорд╛рди рдХреЛ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕рд░рдгреА рдХрд╛ рдПрдХ рд╕рд░рд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд▓реЗрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ
рдХрд░рдирд╛ ,
рдЬрдмрдХрд┐ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдг рджрд┐рдЦрд╛рдирд╛ рд╣реИред
foreach
$arr = ['a', 'b', 'c'];
line #* EIO op fetch ext return operands --------------------------------------------------------------------------- 2 0 E > ASSIGN !0, <array> 4 1 > FE_RESET_R $4 !0, ->7 2 > > FE_FETCH_R ~5 $4, !1, ->7 3 > ASSIGN !2, ~5 4 CONCAT ~7 !2, !1 5 ECHO ~7 6 > JMP ->2 7 > FE_FREE $4 5 8 > RETURN 1
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
FE_RESET_R : рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП
$ 4 рдХрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдмрдирд╛рддрд╛ рд╣реИ
! 0 ред рдпрд╛, рдпрджрд┐ рд╕рд░рдгреА рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдпрд╣ рддреБрд░рдВрдд рдЕрдиреБрджреЗрд╢
7 рдкрд░ рдЬрд╛рддрд╛ рд╣реИ ред
FE_FETCH_R : рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЪрд░рдг рдХрд░рддрд╛ рд╣реИ,
~ 5 рдкрд░ рд╡рд░реНрддрдорд╛рди рдХреБрдВрдЬреА рдФрд░
1 рдкрд░ рдорд╛рди
рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ ред рдпрд╛, рдпрджрд┐ рд╕рд░рдгреА рдХрд╛ рдЕрдВрдд рдкрд╣реБрдБрдЪ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрджреЗрд╢
7 рдкрд░ рдЬрд╛рддрд╛ рд╣реИ ред
рдирд┐рд░реНрджреЗрд╢
3-6 рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ
рд╣реИрдВ ред рдпрд╣рд╛рдБ рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИ рдФрд░
FE_FETCH_R рдкрд░ рд╡рд╛рдкрд╕
рд▓реМрдЯреЗрдВ ред
FE_FREE :
рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреЛ рдирд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред
рдЬрдмрдХрд┐, рдХреЗ рд▓рд┐рдП ...
$length = count($arr); for($i = 0; $i < $length; $i++) echo $i.$arr[$i];
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
рдЬрдмрдХрд┐ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ
$i = 0; while($i < $length) { echo $i.$arr[$i]; $i++; }
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
if + goto рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ
$i = 0; goto check; body: echo $i.$arr[$i]; $i++; check: if($i < $length) goto body;
рддреАрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЗ рдСрдкрдХреЛрдб рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реЛрдВрдЧреЗред рдЬрдм рддрдХ
рдЕрдЧрд░ , рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
JMPNZ JMPZ + JMP рдХреА рдЬреЛрдбрд╝реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛,
рдЕрдЧрд░ рдЙрд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдбреЛ рд▓реВрдк рдХреЗ рд▓рд┐рдП, рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рдж рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг рдСрдкрдХреЛрдб рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред
line #* EIO op fetch ext return operands --------------------------------------------------------------------------- 3 0 E > ASSIGN !0, <array> 5 1 COUNT ~4 !0 2 ASSIGN !1, ~4 6 3 ASSIGN !2, 0 4 > JMP ->10 5 > FETCH_DIM_R ~7 !0, !2 6 CONCAT ~8 !2, ~7 7 ECHO ~8 8 POST_INC ~9 !2 9 FREE ~9 10 > IS_SMALLER ~10 !2, !1 11 > JMPNZ ~10, ->5 12 > > RETURN 1
рдЬреИрд╕реА рдХрд┐ рдЙрдореНрдореАрдж рдереА, рдЕрдзрд┐рдХ рдСрдкрдХреЛрдб рд╣реИрдВред
0-2 :
$ рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ред
3: $ i = 04, 10, 11 : рдирд┐рдХрд╛рд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд╛рдВрдЪ рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╛ рддреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдпрд╛ рдЪрдХреНрд░ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╕рдВрдХреНрд░рдордгред
5 (FETCH_DIM_R): $ рдЧрд┐рд░рдлреНрддрд╛рд░ [$ i]6-7 : рдирд┐рд╖реНрдХрд░реНрд╖
8-9: $ i ++ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд
рдореБрдлрд╝реНрдд рдирд┐рд░реНрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред
10-11 : рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЗ рдмрд╛рдж рдирд┐рдХрд╛рд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ред
рдпрд╛ рдЖрдк рдЕрднреА рднреА рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
$value = reset($arr); $key = key($arr); while($key !== null) { echo $key.$value; $value = next($arr); $key = key($arr); }
рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рдиреАрдЪреЗ рдЪрд╛рджрд░ line #* EIO op fetch ext return operands --------------------------------------------------------------------------- 3 0 E > ASSIGN !0, <array> 5 1 INIT_FCALL 'reset' 2 SEND_REF !0 3 DO_ICALL $4 4 ASSIGN !1, $4 6 5 INIT_FCALL 'key' 6 SEND_VAR !0 7 DO_ICALL $6 8 ASSIGN !2, $6 7 9 > JMP ->20 8 10 > CONCAT ~8 !2, !1 11 ECHO ~8 9 12 INIT_FCALL 'next' 13 SEND_REF !0 14 DO_ICALL $9 15 ASSIGN !1, $9 10 16 INIT_FCALL 'key' 17 SEND_VAR !0 18 DO_ICALL $11 19 ASSIGN !2, $11 7 20 > IS_NOT_IDENTICAL ~13 !2, null 21 > JMPNZ ~13, ->10 11 22 > > RETURN 1
рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ рдореЛрдиреЛрдЯреЛрдирд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝рддреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рдеред
рд░реАрд╕реЗрдЯ ,
рдЕрдЧрд▓рд╛ рдФрд░
рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдмрд╣реБрдд рд╣рд▓реНрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рдЕрднреА рднреА рд╣реИред рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдпреЗ рд▓рд╛рдЧрдд рдЕрдзрд┐рдХ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдлреЙрд░реНрдЪреНрдпреВрдирд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЙрдирдХреЗ рдмреАрдЪ рджреЛ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рд╣реИрдВред
1) рдЬрд╣рд╛рдВ
рд░реАрд╕реЗрдЯ ,
рдЕрдЧрд▓реА рдФрд░
рдХреБрдВрдЬреА (рдФрд░
рд╡рд░реНрддрдорд╛рди рднреА) рдПрдХ рд╕рд░рдгреА рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ,
рдлрд╝реЙрд░рдЪ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдЯреНрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдкреЙрдЗрдВрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рдпрд╛рдиреА
foreach($arr as $v) echo $v.' - '.current($arr).PHP_EOL;
2) рдЬрдм рдореВрд▓реНрдп рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
foreach рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬреЛ рдХреБрдЫ рднреА рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ, рдореВрд▓ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
foreach($arr as $v) { $arr = ['X','Y','Z']; echo $v.PHP_EOL; } var_dump($arr);
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЬрдм рд▓рд┐рдВрдХ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐
рдЗрд╕ RFC рдореЗрдВ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред
array_walk рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде
array_walk($arr, function($value, $key){ echo $key.$value;});
рдЪреВрдВрдХрд┐ рдПрдХ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдлреАрдо рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯ рд╣реЛрдЧрд╛ред
рд╕рдорд╛рд░реЛрд╣
line #* EIO op fetch ext return operands --------------------------------------------------------------------------- 0 E > RECV !0 1 RECV !1 2 CONCAT ~2 !1, !0 3 ECHO ~2 4 > RETURN null
рдореБрдЦреНрдп рдХреЛрдб
line #* EIO op fetch ext return operands --------------------------------------------------------------------------- 2 0 E > ASSIGN !0, <array> 4 1 INIT_FCALL 'array_walk' 2 SEND_REF !0 3 DECLARE_LAMBDA_FUNCTION '%00%7Bclosure%7D%2Fin%2FHuNEK0x7f9fa62d105a' 4 SEND_VAL ~2 5 DO_ICALL 6 > RETURN 1
рдЪреВрдВрдХрд┐
array_walk , рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рдХреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣, рдЖрдВрддрд░рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдУрдкрдХреЛрдб рдореЗрдВ рдХреЛрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред
INIT_FCALL :
array_walk рдкрд░ рдХреЙрд▓ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ
SEND_REF : рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рд╕рд░рдгреА рд╕рдВрджрд░реНрдн рдбрд╛рд▓реЗрдВ
DECLARE_LAMBDA_FUNCTION : рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
SEND_VAL : рд╣рдордиреЗ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдбрд╛рд▓рд╛
DO_ICALL : рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
array_walk рдЪрд▓рд╛рдПрдВ
рдЕрдЧрд▓рд╛, рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЬрд╛рджреВ рд╣реЛрддрд╛ рд╣реИред
array_walk рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
рдПрдХ рдЕрдирд╛рдо рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╢рд╛рдпрдж рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд▓реИрдореНрдмрдбрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдереЛрдбрд╝рд╛ рдХрдоред
line #* EIO op fetch ext return operands --------------------------------------------------------------------------- 3 0 E > ASSIGN !0, <array> 9 2 INIT_FCALL 'array_walk' 3 SEND_REF !0 4 SEND_VAL 'my_echo' 5 DO_ICALL 6 > RETURN 1
рдирд┐рд╖реНрдХрд░реНрд╖ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВред
foreach рдХреЛ рдПрд░рд░реЗрдЯрд┐рдВрдЧ рдПрд░реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрд╛рдХреА рд▓реВрдкреНрд╕ рдХреЗрд╡рд▓
+ рдЧреЛрдЯреЛ рдХреЗ рдКрдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрд╛рд░реНрдп рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдереЛрдбрд╝рд╛ рдФрд░ рдЧрд╣рд░рд╛ рдЙрддрд░рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕рдХреЗ рдФрд░ рдЗрд╕рдХреЗ opcode
FETCH_DIM_R рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдорд╛рди рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдЯрдо рдХреЛ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ (
ZEND_HASH_INDEX_FIND ) рдореЗрдВ рдПрдХ рдЦреЛрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╖реНрдХрд░реНрд╖рдг рдПрдХ
рднрд░реЗ рд╣реБрдП рд╕рд░рдгреА рд╕реЗ рдЖрддрд╛ рд╣реИ (рдЪрд╛рдмрд┐рдпрд╛рдБ рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЕрдиреБрдХреНрд░рдо рд╣реИрдВ) - рдпрд╣ рдПрдХ рдХрд╛рдлреА рдЖрд╕рд╛рди рдФрд░ рддреНрд╡рд░рд┐рдд рд╕рдВрдЪрд╛рд▓рди рд╣реИред рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛ред
рдЕрдм
foreach (
FE_FETCH_R )ред рд╕рдм рдХреБрдЫ рдпрд╣рд╛рдБ рд╣реИ:
- рдпрд╣ рджреЗрдЦрдирд╛ рдХрд┐ рдЕрдЧрд░ рдЗрдЯрд░реНрдЗрдВрдЯрд░ рдкреЙрдЗрдВрдЯрд░ рдРрд░реЗ рдХреЗ рдмрд╛рд╣рд░ рд╣реИ
- рд╡рд░реНрддрдорд╛рди рдХреБрдВрдЬреА рдФрд░ рдореВрд▓реНрдп рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рд╡реГрджреНрдзрд┐ рд╕реВрдЪрдХ
рдЦреИрд░,
array_walk рдЬреИрд╕реЗ
рдлрдВрдХреНрд╢рдВрд╕ рдХрд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡реЗ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИрдВред
рдпрджрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ (рдЫрджреНрдо рдХреЛрдб):
reset_pointer() do { value = get_current_value() if (value == NULL) break
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рд╕рдорд╛рди рд╣реИ - PHP рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд▓реЗрддреЗ) рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рд╣реИред
рдЦреИрд░, рдХреБрдЫ рдорд╛рдк
рдФрд░ рдлрд┐рд░ рдЖрдЦрд┐рд░рдХрд╛рд░, рдорд╛рдк рдХреЗ рдмрд┐рдирд╛ рд▓реЗрдЦ рдХреНрдпрд╛ рд╣реИ (рд╕реНрдореГрддрд┐ рд╕реЗ рдпрд╣ рдЗрддрдирд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирд┐рдХрд▓рд╛ рдХрд┐ рдЙрд╕рдиреЗ рдЕрдкрдирд╛ рдорд╛рдк рд╣рдЯрд╛ рджрд┐рдпрд╛)ред
рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд░рдВрдкрд░рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо 70.108 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП zend_vm_execute.h рд▓реЗрддреЗ рд╣реИрдВред
Spoiler рдкреИрдорд╛рдЗрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ <?php $array = explode("\n", file_get_contents('/Users/rjhdby/CLionProjects/php-src/Zend/zend_vm_execute.h')); function myEcho($key, $value){ echo $key . $value; } ob_start(); $startTime = microtime(true); for ($i = 0; $i < 10; $i++) {
рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдк рдХреЛ 10 рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдкрд╣рд▓реЗ 4 рдЕрдВрдХреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
foreach time: 0.12159085273743 foreach(reference) time: 0.11191201210022 for, while time: 0.13130807876587 array_walk(lambda) time: 0.87953400611877 array_walk(static lambda) time: 0.87544417497211 array_walk(name) time: 0.50753092765808 next,key time: 1.06258893013
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛
рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рди рднреВрд▓реЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ 70 рд╣рдЬрд╛рд░ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 10 рдкрд╛рд╕ рджрд┐рдП рдЧрдП рдереЗред
рдкреВрд░реНрдг рд╡рд┐рд░реЛрдзреА рдирд╛рдпрдХ
рдЕрдЧрд▓реА / рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде
foreach рдХрд╛ "рдЕрдиреБрдХрд░рдг" рдерд╛ред рдЬрдм рддрдХ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛ рдРрд╕рд╛ рди рдХрд░реЗрдВред
array_walk рдХреЗ рд╕рд╛рде рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдЙрд╕рдХреА рдкреАрда рдореЗрдВ рд╕рд╛рдБрд╕ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред рдЖрдЧрд╛рдореА JIT рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддреА рд╣реИред рдпрд╛ рд╢рд╛рдпрдж рдирд╣реАрдВ рдмрджрд▓рд╛ред рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред
array_walk рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдордЬрдмреВрдд рдорд┐рдбрд▓рд┐рдВрдЧ рд╣реИред
рдЪреВрдВрдХрд┐ рдПрдХ рд▓рд┐рдВрдХ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рд╣реЛрдиреЗ рдкрд░
foreach рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╣
FE_FETCH_RW opcode рдХреЗ рдмрдЬрд╛рдп
FE_FETCH_R рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдЗрд╕рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдорд╛рдк рдмрдирд╛рдпрд╛ред рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдереЛрдбрд╝рд╛ рддреЗрдЬ рдирд┐рдХрд▓рд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдордХреНрдЦреА рдкрд░ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдмрдирд╛рдирд╛ рд╕рдмрд╕реЗ рд╕рд╕реНрддрд╛ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ 10 рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред
рдЕрдиреНрдп рд╕рднреА рддрд░реАрдХреЛрдВ рдиреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдП, рдмрд╣реБрдд рдорд╛рдореВрд▓реА рдЕрдВрддрд░ рдХреЗ рд╕рд╛рдеред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ, рддреЛ рдЖрдк "рдкрд┐рдХ" рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдореИрдВ рдЕрднреА рднреА рд▓рдВрдмреЛрджрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ - рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБрдд рд╡рд┐рдЪрд┐рддреНрд░ рд╣реИред
рдпреБрдкреАрдбреАрд╕реНрдерд┐рд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд╕рд╛рде
array_walk рдХреЗ рд▓рд┐рдП рдкреИрдорд╛рдЗрд╢ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред