1. Token
Token含义对应表如表B-1所示。
表B-1 Token含义对应表
| Token标识符 | Code | 含义 |
|---|---|---|
| END | 0 | |
| T_REQUIRE_ONCE | 258 | require_once |
| T_REQUIRE | 259 | require |
| T_EVAL | 260 | eval |
| T_INCLUDE_ONCE | 261 | include_once |
| T_INCLUDE | 262 | include |
| T_LOGICAL_OR | 263 | or |
| T_LOGICAL_XOR | 264 | xor |
| T_LOGICAL_AND | 265 | and |
| T_PRINT | 266 | |
| T_YIELD | 267 | yield |
| T_DOUBLE_ARROW | 268 | => |
| T_YIELD_FROM | 269 | yield from |
| T_POW_EQUAL | 270 | **= |
| T_SR_EQUAL | 271 | >>= |
| T_SL_EQUAL | 272 | <<= |
| T_XOR_EQUAL | 273 | ^= |
| T_OR_EQUAL | 274 | != |
| T_AND_EQUAL | 275 | &= |
| T_MOD_EQUAL | 276 | %= |
| T_CONCAT_EQUAL | 277 | .= |
| T_DIV_EQUAL | 278 | /= |
| T_MUL_EQUAL | 279 | *= |
| T_MINUS_EQUAL | 280 | _= |
| T_PLUS_EQUAL | 281 | += |
| T_COALESCE | 282 | ?? |
| T_BOOLEAN_OR | 283 | |
| T_BOOLEAN_AND | 284 | && |
| T_SPACESHIP | 285 | <=> |
| T_IS_NOT_IDENTICAL | 286 | !== |
| T_IS_IDENTICAL | 287 | === |
| T_IS_NOT_EQUAL | 288 | != 或 <> |
| T_IS_EQUAL | 289 | == |
| T_IS_GREATER_OR_EQUAL | 290 | >= |
| T_IS_SMALLER_OR_EQUAL | 291 | <= |
| T_SR | 292 | >> |
| T_SL | 293 | << |
| T_INSTANCEOF | 294 | instanceof |
| T_UNSET_CAST | 295 | (unset) |
| T_BOOL_CAST | 296 | (bool) |
| T_OBJECT_CAST | 297 | (object) |
| T_ARRAY_CAST | 298 | (array) |
| T_STRING_CAST | 299 | (string) |
| T_DOUBLE_CAST | 300 | (double) |
| T_INT_CAST | 301 | (int) |
| T_DEC | 302 | -- |
| T_INC | 303 | ++ |
| T_POW | 304 | ** |
| T_CLONE | 305 | clone |
| T_NEW | 306 | new |
| T_NOELSE | 307 | |
| T_ELSEIF | 308 | elseif |
| T_ELSE | 309 | else |
| T_ENDIF | 310 | endif |
| T_PUBLIC | 311 | public |
| T_PROTECTED | 312 | protected |
| T_PRIVATE | 313 | private |
| T_FINAL | 314 | final |
| T_ABSTRACT | 315 | abstract class |
| T_STATIC | 316 | static |
| T_LNUMBER | 317 | 整型 |
| T_DNUMBER | 318 | 浮点型 |
| T_STRING | 319 | 字符串 |
| T_VARIABLE | 320 | 变量$xx |
| T_INLINE_HTML | 321 | html字符串 |
| T_ENCAPSED_AND_WHITESPACE | 322 | 双引号包裹的含有变量的字符串 |
| T_CONSTANT_ENCAPSED_STRING | 323 | 引号包裹的字符串 |
| T_STRING_VARNAME | 324 | 花括号语法${ |
| T_NUM_STRING | 325 | 字符串中的数字数组索引 |
| T_EXIT | 326 | exit |
| T_IF | 327 | if |
| T_ECHO | 328 | echo |
| T_DO | 329 | do |
| T_WHILE | 330 | while |
| T_ENDWHILE | 331 | endwhile |
| T_FOR | 332 | for |
| T_ENDFOR | 333 | endfor |
| T_FOREACH | 334 | foreach |
| T_ENDFOREACH | 335 | endforeach |
| T_DECLARE | 336 | declare |
| T_ENDDECLARE | 337 | enddeclare |
| T_AS | 338 | as |
| T_SWITCH | 339 | switch |
| T_ENDSWITCH | 340 | endswitch |
| T_CASE | 341 | case |
| T_DEFAULT | 342 | default |
| T_BREAK | 343 | break |
| T_CONTINUE | 344 | continue |
| T_GOTO | 345 | goto |
| T_FUNCTION | 346 | function |
| T_CONST | 347 | const |
| T_RETURN | 348 | return |
| T_TRY | 349 | try |
| T_CATCH | 350 | catch |
| T_FINALLY | 351 | finally |
| T_THROW | 352 | throw |
| T_USE | 353 | use |
| T_INSTEADOF | 354 | insteadof |
| T_GLOBAL | 355 | global |
| T_VAR | 356 | var |
| T_UNSET | 357 | unset |
| T_ISSET | 358 | isset |
| T_EMPTY | 359 | empty |
| T_HALT_COMPILER | 360 | _halt_compiler |
| T_CLASS | 361 | class |
| T_TRAIT | 362 | trait |
| T_INTERFACE | 363 | interface |
| T_EXTENDS | 364 | extends |
| T_IMPLEMENTS | 365 | impleements |
| T_OBJECT_OPERATOR | 366 | -> |
| T_LIST | 367 | list |
| T_ARRAY | 368 | array |
| T_CALLABLE | 369 | callable |
| T_LINE | 370 | LINE |
| T_FILE | 371 | FILE |
| T_DIR | 372 | DIR |
| T_CLASS_C | 373 | CLASS |
| T_TRAIT_C | 374 | TRAIT |
| T_METHOD_C | 375 | METHOD |
| T_FUNC_C | 376 | FUNCTION |
| T_COMMENT | 377 | // 或 #风格的注释 |
| T_DOC_COMMENT | 378 | /** **/风格的doccomment |
| T_OPEN_TAG | 379 | <?php |
| T_OPEN_TAG_WITH_ECHO | 380 | <?= |
| T_CLOSE_TAG | 381 | ?> |
| T_WHITESPACE | 382 | \t |
| T_START_HEREDOC | 383 | heredoc结构的字符串开始 |
| T_END_HEREDOC | 384 | heredoc结构的字符串结尾 |
| T_DOLLAR_OPEN_CURLY_BRACES | 385 | ${ |
| T_CURLY_OPEN | 386 | {$ |
| T_PAAMAYIM_NEKUDOTAYIM | 387 | :: |
| T_NAMESPACE | 388 | namespace |
| T_NS_C | 389 | NAMESPACE |
| T_NS_SEPARATOR | 390 | 命名空间分隔符\ |
| T_ELLIPSIS | 391 | 可变参数... |
| T_ERROR | 392 | 语法错误 |
2. opcode
opcode含义对应表如表B-2所示。
表B-2 opcode含义对应表
| opcode | Code | 含义 |
|---|---|---|
| ZEND_NOP | 0 | 空操作,空函数或者其他无用操作会优化成这个 |
| ZEND_ADD | 1 | 加 1+1 |
| ZEND_SUB | 2 | 减 1-1 |
| ZEND_MUL | 3 | 乘 1*1 |
| ZEND_DIV | 4 | 除 1/1 |
| ZEND_MOD | 5 | 取模 1%1 |
| ZEND_SL | 6 | 位左移 1<<1 |
| ZEND_SR | 7 | 位右移 1>>1 |
| ZEND_CONCAT | 8 | 连接字符串 1.1 |
| ZEND_BW_OR | 9 | 按位或 1|1 |
| ZEND_BW_AND | 10 | 按位与 1&1 |
| ZEND_BW_XOR | 11 | 按位异或 1^1 |
| ZEND_BW_NOT | 12 | 按位取反 ~1 |
| ZEND_BOOL_NOT | 13 | 逻辑非 !1 |
| ZEND_BOOL_XOR | 14 | 逻辑异或 1xor0 |
| ZEND_IS_IDENTICAL | 15 | 全等于 === |
| ZEND_IS_NOT_IDENTICAL | 16 | 不全等于 !== |
| ZEND_IS_EQUAL | 17 | 等于 == |
| ZEND_IS_NOT_EQUAL | 18 | 不等于 != |
| ZEND_IS_SMALLER | 19 | 小于 < |
| ZEND_IS_SMALLER_OR_EQUAL | 20 | 小于等于 <= |
| ZEND_CAST | 21 | 类型转换 $a=(int)'1'; |
| ZEND_QM_ASSIGN | 22 | 三元运算 $a=1?2:3; |
| ZEND_ASSIGN_ADD | 23 | 加等于 $a+=1; |
| ZEND_ASSIGN_SUB | 24 | 减等于 $a-=1; |
| ZEND_ASSIGN_MUL | 25 | 乘等于 $a*=1; |
| ZEND_ASSIGN_DIV | 26 | 除等于 $a/=1; |
| ZEND_ASSIGN_MOD | 27 | 取模等于 $a%=1; |
| ZEND_ASSIGN_SL | 28 | 位左移等于 $a<<=1; |
| ZEND_ASSIGN_SR | 29 | 位右移等于 $a>>=1; |
| ZEND_ASSIGN_CONCAT | 30 | 连接等于 $a.=1; |
| ZEND_ASSIGN_BW_OR | 31 | 按位或等于 $a|=1; |
| ZEND_ASSIGN_BW_AND | 32 | 按位与等于 $a&=1; |
| ZEND_ASSIGN_BW_XOR | 33 | 按位异或 $a^=1; |
| ZEND_PRE_INC | 34 | 前自增 ++$a; |
| ZEND_PRE_DEC | 35 | 前自减 --$a; |
| ZEND_POST_INC | 36 | 后自增 $a++; |
| ZEND_POST_DEC | 37 | 后自减 $a--; |
| ZEND_ASSIGN | 38 | 赋值 $a=1; |
| ZEND_ASSIGN_REF | 39 | 引用赋值 $a=&$b; |
| ZEND_ECHO | 40 | echo |
| ZEND_GENERATOR_CREATE | 41 | generator函数声明 |
| ZEND_JMP | 42 | 无条件跳转 |
| ZEND_JMPZ | 43 | 如果为零的条件跳转 |
| ZEND_JMPNZ | 44 | 如果不为零的条件跳转 |
| ZEND_JMPZNZ | 45 | |
| ZEND_JMPZ_EX | 46 | |
| ZEND_JMPNZ_EX | 47 | |
| ZEND_CASE | 48 | |
| ZEND_CHECK_VAR | 49 | |
| ZEND_SEND_VAR_NO_REF_EX | 50 | |
| ZEND_MAKE_REF | 51 | |
| ZEND_BOOL | 52 | bool转换 |
| ZEND_FAST_CONCAT | 53 | |
| ZEND_ROPE_INIT | 54 | |
| ZEND_ROPE_ADD | 55 | |
| ZEND_ROPE_END | 56 | |
| ZEND_BEGIN_SILENCE | 57 | 错误屏蔽开始 |
| ZEND_END_SILENCE | 58 | 错误屏蔽结束 |
| ZEND_INIT_FCALL_BY_NAME | 59 | 通过包含函数名称的变量来调用函数 |
| ZEND_DO_FCALL | 60 | 函数调用 |
| ZEND_INIT_FCALL | 61 | |
| ZEND_RETURN | 62 | 函数返回 |
| ZEND_RECV | 63 | 接受参数 |
| ZEND_RECV_INIT | 64 | 接受默认参数 |
| ZEND_SEND_VAL | 65 | 调用函数时传递值 |
| ZEND_SEND_VAR_EX | 66 | |
| ZEND_SEND_REF | 67 | 用于在编译期间已知为引用的参数 |
| ZEND_NEW | 68 | new class |
| ZEND_INIT_NS_FCALL_BY_NAME | 69 | 命名空间函数调用 |
| ZEND_FREE | 70 | 释放空间 |
| ZEND_INIT_ARRAY | 71 | 数组初始化 |
| ZEND_ADD_ARRAY_ELEMENT | 72 | 数组添加元素 |
| ZEND_INCLUDE_OR_EVAL | 73 | include、require、eval |
| ZEND_UNSET_VAR | 74 | 销毁对象 |
| ZEND_UNSET_DIM | 75 | 销毁数组中的某一个变量 |
| ZEND_UNEST_OBJ | 76 | 销毁对象 |
| ZEND_FE_RESET_R | 77 | |
| ZEND_FE_FETCH_R | 78 | |
| ZEND_EXIT | 79 | 退出程序 |
| ZEND_FETCH_R | 80 | 获取变量地址、只读 |
| ZEND_FETCH_DIM_R | 81 | 获取数组变量地址、只读 |
| ZEND_FETCH_OBJ_R | 82 | 获取对象变量地址、只读 |
| ZEND_FETCH_W | 83 | 获取变量地址,并写入 |
| ZEND_FETCH_DIM_W | 84 | 获取数组变量地址,并写入 |
| ZEND_FETCH_OBJ_W | 85 | |
| ZEND_FETCH_RW | 86 | |
| ZEND_FETCH_DIM_RW | 87 | |
| ZEND_FETCH_OBJ_RW | 88 | |
| ZEND_FETCH_IS | 89 | 检测变量是否设置,常见于isset和empty |
| ZEND_FETCH_DIM_IS | 90 | |
| ZEND_FETCH_OBJ_IS | 91 | |
| ZEND_FETCH_FUNC_ARG | 92 | |
| ZEND_FETCH_DIM_FUNC_ARG | 93 | |
| ZEND_FETCH_OBJ_FUNC_ARG | 94 | |
| ZEND_FETCH_UNSET | 95 | |
| ZEND_FETCH_DIM_UNSET | 96 | |
| ZEND_FETCH_OBJ_UNSET | 97 | |
| ZEND_FETCH_LIST | 98 | |
| ZEND_FETCH_CONSTANT | 99 | |
| ZEND_EXT_STMT | 101 | |
| ZEND_EXT_FCALL_BEGIN | 102 | |
| ZEND_EXT_FCALL_END | 103 | |
| ZEND_EXT_NOP | 104 | |
| ZEND_TICKS | 105 | 时钟周期相关 |
| ZEND_SEND_VAR_NO_REF | 106 | |
| ZEND_CATCH | 107 | 异常捕获 |
| ZEND_THROW | 108 | 抛出异常 |
| ZEND_FETCH_CLASS | 109 | 使用对象名称获取对象指针 |
| ZEND_CLONE | 110 | 对象克隆 |
| ZEND_RETURN_BY_REF | 111 | 返回值为引用 |
| ZEND_INIT_METHOD_CALL | 112 | 对象方法调用初始化 |
| ZEND_INIT_STATIC_METHOD_CALL | 113 | 对象静态方法调用初始化 |
| ZEND_ISSET_ISEMPTY_VAR | 114 | 标量类型变量IS测试 |
| ZEND_ISSET_ISEMPTY_DIM_OBJ | 115 | 数组或对象类型变量IS测试 |
| ZEND_SEND_VAL_EXT | 116 | |
| ZEND_SEND_VAR | 117 | 调用函数时传递变量 |
| ZEND_INIT_USER_CALL | 118 | call_user_function函数 |
| ZEND_SEND_ARRAY | 119 | |
| ZEND_SEND_USER | 120 | |
| ZEND_STRLEN | 121 | strlen函数 |
| ZEND_DEFINED | 122 | defined函数,检查非命名空间的常量是否存在 |
| ZEND_TYPE_CHECK | 123 | 检测变量类型系列函数 |
| ZEND_VERIFY_RETURN_TYPE | 124 | 返回值类型检查 |
| ZEND_FE_RESET_RW | 125 | |
| ZEND_FE_FETCH_RW | 126 | |
| ZEND_FE_FREE | 127 | |
| ZEND_INIT_DYNAMIC_CALL | 128 | 初始化动态函数create_function |
| ZEND_DO_ICALL | 129 | |
| ZEND_DO_UCALL | 130 | |
| ZEND_DO_FCALL_BY_NAME | 131 | 通过名称调用函数 |
| ZEND_PRE_INC_OBJ | 132 | 对象属性前自增 |
| ZEND_PRE_DEC_OBJ | 133 | 对象属性前自减 |
| ZEND_POST_INC_OBJ | 134 | 对象属性后自增 |
| ZEND_POST_DEC_OBJ | 135 | 对象属性后自减 |
| ZEND_ASSIGN_OBJ | 136 | 对象赋值 |
| ZEND_OP_DATA | 137 | |
| ZEND_INSTANCEOF | 138 | Instanceof操作符 |
| ZEND_DECLARE_CLASS | 139 | 类声明 |
| ZEND_DECLARE_INHERITED_CLASS | 140 | 继承类声明 |
| ZEND_DECLARE_FUNCTION | 141 | 函数声明 |
| ZEND_YIELD_FROM | 142 | yield from语法,generator中调用generator |
| ZEND_DECLARE_CONST | 143 | 类常量声明 |
| ZEND_ADD_INTERFACE | 144 | 类声明时添加接口 |
| ZEND_DECLARE_INHERITED_CLASS_DELAYED | 145 | 声明继承类,使用delayedearlybinding |
| ZEND_VERIFY_ABSTRACT_CLASS | 146 | 实现接口后的验证 |
| ZEND_ASSIGN_DIM | 147 | 数组元素赋值 |
| ZEND_ISSET_ISEMPTY_PROP_OBJ | 148 | 对象属性is测试 |
| ZEND_HANDLE_EXCEPTION | 149 | |
| ZEND_USER_OPCODE | 150 | |
| ZEND_ASSERT_CHECK | 151 | |
| ZEND_JMP_SET | 152 | ?: 语法,注意是省略了中间部分的三元运算符,完整的三元运算符其opcode不是这个 |
| ZEND_DECLARE_LAMBDA_FUNCTION | 153 | 匿名函数声明 |
| ZEND_ADD_TRAIT | 154 | |
| ZEND_BIND_TRAITS | 155 | |
| ZEND_SEPARATE | 156 | |
| ZEND_FETCH_CLASS_NAME | 157 | |
| ZEND_CALL_TRAMPOLINE | 158 | |
| ZEND_DISCARD_EXCEPTION | 159 | |
| ZEND_YIELD | 160 | yield关键字 |
| ZEND_GENERATOR_RETURN | 161 | generator函数返回 |
| ZEND_FAST_CALL | 162 | |
| ZEND_FAST_RET | 163 | |
| ZEND_RECV_VARIADIC | 164 | |
| ZEND_SEND_UNPACK | 165 | |
| ZEND_POW | 166 | ** |
| ZEND_ASSIGN_POW | 167 | **= |
| ZEND_BIND_GLOBAL | 168 | |
| ZEND_COALESCE | 169 | null合并操作符?? |
| ZEND_SPACESHIP | 170 | 太空船操作符<=> |
| ZEND_DECLARE_ANON_CLASS | 171 | |
| ZEND_DECLARE_ANON_INHERITED_CLASS | 172 | |
| ZEND_FETCH_STATIC_PROP_R | 173 | |
| ZEND_FETCH_STATIC_PROP_W | 174 | |
| ZEND_FETCH_STATIC_PROP_RW | 175 | |
| ZEND_FETCH_STATIC_PROP_IS | 176 | |
| ZEND_FETCH_STATIC_PROP_FUNC_ARG | 177 | |
| ZEND_FETCH_STATIC_PROP_UNSET | 178 | |
| ZEND_UNSET_STATIC_PROP | 179 | |
| ZEND_ISSET_ISEMPTY_STATIC_PROP | 180 | |
| ZEND_FETCH_CLASS_CONSTANT | 181 | |
| ZEND_BIND_LEXICAL | 182 | |
| ZEND_BIND_STATIC | 183 | |
| ZEND_FETCH_THIS | 184 | |
| ZEND_ISSET_ISEMPTY_THIS | 185 | 对象中this变量is测试 |
| ZEND_VM_LAST_OPCODE | 186 |