78
  <?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
4

2 に答える 2

45

Vulcan Logic Disassembler PECL拡張機能を確認してください。詳細については、作成者のホームページを参照してください。

Vulcan LogicDisassemblerはZendEngineにフックし、スクリプトのすべてのオペコード(実行ユニット)をダンプします。それはエンコーダーの始まりとして書かれましたが、私はそのための時間がありませんでした。ZendEngineで何が起こっているかを確認するために使用できます。

インストールすると、次のように使用できます。

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

オペコード抽出に関するこの興味深いブログ投稿、および利用可能なオペコードをリストしたPHPマニュアルページも参照してください。

于 2009-11-25T08:28:15.097 に答える
13

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

出力は非常に冗長であるため、アセンブラのような形式を取得するには、出力を処理する必要があります。

  ["オペコード"]=>
  array(10){
    [0] =>
    array(9){
      ["アドレス"]=>
      int(44682716)
      ["オペコード"]=>
      int(101)
      ["opcode_name"] =>
      string(13) "ZEND_EXT_STMT"
      ["フラグ"]=>
      int(4294967295)
      ["結果"]=>
      array(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"] =>
      array(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)
      }
于 2012-02-28T12:09:11.497 に答える