如何获得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 

查看Vulcan Logic Disassembler PECL扩展 – 查看作者的主页获取更多信息。

Vulcan Logic Disassembler挂接到Zend Engine并转储脚本的所有操作码(执行单元)。 它被写为一个编码器的开始,但我从来没有这个时间。 它可以用来查看Zend引擎中发生了什么。

一旦安装,你可以像这样使用它:

 php -d vld.active=1 -d vld.execute=0 -f yourscript.php 

另请参阅有关操作码抽取的有趣博客文章 ,以及列出可用操作码的PHP手册页 。

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
 ));

输出是非常详细的,所以你需要处理它得到类似汇编的格式。

   [ “操作码”] =>
  数组(10){
     [0] =>
    数组(9){
       [ “地址”] =>
       INT(44682716)
       [ “操作码”] =>
       INT(101)
       [ “opcode_name”] =>
      string(13)“ZEND_EXT_STMT”
       [ “标志”] =>
       INT(4294967295)
       [ “结果”] =>
      数组(8){
         [ “型”] =>
         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”] =>
      数组(8){
         [ “型”] =>
         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)
       }