编程语言
首页 > 编程语言> > PHP解释器是否消除了死条件?

PHP解释器是否消除了死条件?

作者:互联网

在将PHP源代码转换为操作码之前,是否存在消除死条件的优化过程?

例:

<?php

if (false) {
  echo 'false';
}
echo 'true';

它变成了回声’真’;?

如果答案是肯定的,PHP可以处理以下哪种情况?

if(false);               //Explicit boolean
$true = true; if($true); //Variable that was assigned a constant boolean
if(ClassName::Constant); //Class constant
if(1>2);                 //Constant value expression

如果有版本特定的差异,请慷慨.

解决方法:

是的,opcache优化器的“块传递”部分将消除无法访问的块.对于您的特定示例:

if(false);               // 1. Will be optimized
$true = true; if($true); // 2. Will NOT be optimized
if(ClassName::Constant); // 3. Will MAYBE be optimized
if(1>2);                 // 4. Will be optimized

示例2将不会被优化,因为我们当前不对“真实”变量执行常量传播.目前,优化器不使用SSA形式,因此我们没有信心执行此类优化.一旦我们有了这个,我们可以使用SCP / SCCP通行证来解决这个问题.

可以优化示例3,具体取决于ClassName的定义位置.通常,如果它是非可重新绑定范围中的self或同一文件中定义的类,则将进行优化.此外,常数的值还必须是静态可评估的常量表达式.

无法访问的代码消除是作为block_pass.c的一部分实现的.

标签:php-internals,php
来源: https://codeday.me/bug/20190724/1526426.html