微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在if语句中理解PHP操作代码

我正在尝试理解一个简单代码的操作码.

代码是:

<?PHP

$a = TRUE;

$b = FALSE;

if($a && $b) {
    echo 'done';
}

上面代码的操作码是:

PHP -dvld.active=1 test.PHP
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = 3,Position 2 = 4
Branch analysis from position: 3
Jump found. Position 1 = 5,Position 2 = 7
Branch analysis from position: 5
Jump found. Position 1 = 7
Branch analysis from position: 7
Return found
Branch analysis from position: 7
Branch analysis from position: 4
filename:       /home/starlays/learning/test.PHP
function name:  (null)
number of ops:  8
compiled vars:  !0 = $a,!1 = $b
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   ASSIGN                                                   !0,true
   5     1      ASSIGN                                                   !1,false
   7     2    > JMPZ_EX                                          ~2      !0,->4
         3  >   BOOL                                             ~2      !1
         4  > > JMPZ                                                     ~2,->7
   8     5  >   ECHO                                                     'done'
   9     6    > JMP                                                      ->7
  10     7  > > RETURN                                                   1

branch: #  0; line:     3-    7; sop:     0; eop:     2; out1:   3; out2:   4
branch: #  3; line:     7-    7; sop:     3; eop:     3; out1:   4
branch: #  4; line:     7-    7; sop:     4; eop:     4; out1:   5; out2:   7
branch: #  5; line:     8-    9; sop:     5; eop:     6; out1:   7
branch: #  7; line:    10-   10; sop:     7; eop:     7
path #1: 0,3,4,5,7,path #2: 0,path #3: 0,path #4: 0,

我试图了解第7行发生了什么,评估是如何完成的?它在if的表达式中输入了多少个值?它输入3个值,或者输入2个值为$a的值和$b的值,之后是否计算if括号中的表达式?

我已经阅读了JMPZ_EX的手册,我已经理解了操作代码中发生的事情,直到第2步之后有点混乱,我很难理解PHP正在做什么的确切步骤.

我需要理解的另一件事是操作码中的所有分支是什么,最后将使用哪些分支?

除非你精通 ASM,否则我认为理解正在发生的事情的最简单方法是通过在PHP中读取(几乎)1:1表示来查看相同的代码
if(!$a) goto end;
if(!$b) goto end;
echo 'done';
end: return 0;

中间表示基于对实际子句的否定,以跳过if块中包含的代码.

如果你想真正理解PHP如何将其输入转换为这个操作码数组,你将不得不学习PHP内部,但在学习the dragon book之前,尤其是关于中间表示的部分,这是编译管道的一部分.

其余的操作码是“背景噪声”,中间值,或甚至一条没有意义的指令9 6>简单存在的JMP – > 7可能是因为没有必要努力使PHP解析器为ZendVM运行最优化的操作码数组.

原文地址:https://www.jb51.cc/php/137279.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐