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