php internals — Устраняет ли интерпретатор PHP мертвые условия?

Перед преобразованием исходного кода PHP в код операции, есть ли процесс оптимизации, который устраняет мертвые условия?

Пример:

<?php

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

Это превращается просто 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

Если есть различия в конкретной версии, пожалуйста, будьте щедрыми.

3

Решение

Да, недостижимые блоки будут устранены частью «прохода блока» оптимизатора 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.

8

Другие решения

Просто нет, это не устраняет какой-либо код.

0

По вопросам рекламы [email protected]