在将PHP源代码转换为操作码之前,是否存在消除死条件的优化过程?
示例:
GetDay()
是否只转换为<?php
if (false) {
echo 'false';
}
echo 'true';
?
如果答案为是,那么PHP可以处理以下哪种情况?
echo 'true';
如果有特定版本的差异,请慷慨。
答案 0 :(得分:8)
是的,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的一部分实现的。
答案 1 :(得分:0)
根本不,它不会消除任何代码。