<?php
$show_value = 123;
echo 'sing_quote'.$show_value;
echo "double_quote{$show_value}";
?>
其操作码是:
1: <?php
2: $show_value = 123;
0 ASSIGN !0, 123
3: echo 'sing_quote'.$show_value;
1 CONCAT 'sing_quote', !0 =>RES[~1]
2 ECHO ~1
4: echo "double_quote{$show_value}";
3 ADD_STRING 'double_quote' =>RES[~2]
4 ADD_VAR ~2, !0 =>RES[~2]
5 ECHO ~2
6 RETURN 1
答案 0 :(得分:39)
查看Vulcan Logic Disassembler PECL扩展程序 - 有关详细信息,请参阅author's home page。
Vulcan Logic Disassembler挂钩 进入Zend引擎并转储所有 脚本的操作码(执行单元)。 它被写成一个开头 编码器,但我没有时间 那。它可以用来看看是什么 在Zend Engine中继续。
安装完成后,您可以像这样使用它:
php -d vld.active=1 -d vld.execute=0 -f yourscript.php
另请参阅此interesting blog post on opcode extraction和PHP manual page listing the available opcodes。
答案 1 :(得分:12)
Parsekit有parsekit_compile_string()。
sudo pecl install parsekit
var_dump(parsekit_compile_string(<<<PHP \$show_value = 123; echo 'sing_quote'.\$show_value; echo "double_quote{\$show_value}"; PHP ));
输出非常详细,因此您需要处理它以获得类似汇编程序的格式。
["opcodes"]=> array(10) { [0]=> array(9) { ["address"]=> int(44682716) ["opcode"]=> int(101) ["opcode_name"]=> string(13) "ZEND_EXT_STMT" ["flags"]=> int(4294967295) ["result"]=> array(8) { ["type"]=> int(8) ["type_name"]=> string(9) "IS_UNUSED" ["var"]=> int(0) ["opline_num"]=> string(1) "0" ["op_array"]=> string(1) "0" ["jmp_addr"]=> string(1) "0" ["jmp_offset"]=> string(8) "35419039" ["EA.type"]=> int(0) } ["op1"]=> array(8) { ["type"]=> int(8) ["type_name"]=> string(9) "IS_UNUSED" ["var"]=> int(0) ["opline_num"]=> string(1) "0" ["op_array"]=> string(1) "0" ["jmp_addr"]=> string(1) "0" ["jmp_offset"]=> string(8) "35419039" ["EA.type"]=> int(0) }