Как получить коды операций PHP?
<?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
Ответы
Ответ 1
Посмотрите Vulcan Logic Disassembler Расширение PECL - см. домашняя страница автора для получения дополнительной информации.
Ключи для демонтажа Vulcan Logic Disassembler в двигатель Zend и сбрасывает все opcodes (исполнительные элементы) script. Это было написано как начало кодер, но у меня не было времени для что. Его можно использовать для просмотра того, что происходит в Zend Engine.
После установки вы можете использовать его следующим образом:
php -d vld.active=1 -d vld.execute=0 -f yourscript.php
См. также интересное сообщение в блоге об извлечении опкода и PHP на странице справочника, где перечислены доступные коды операций.
Ответ 2
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)
}