2015-11-21 2 views
3

Прежде чем преобразовать исходный код 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 

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

+0

, чтобы быть справедливым php действительно пытается оптимизировать код во время выполнения – ins0

+1

Большая проблема для оптимизации заключается в том, что переменные «типизируются динамически», поэтому могут иметь совершенно разные вещи в разное время (и часто это делать). Это затрудняет оптимизацию. –

+0

да просто хочу сказать, что php пытается оптимизировать код, но на пути меньше задачи – ins0

ответ

7

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

+0

Пример 3 (неправильный номер ;-)) будет оптимизирован в случае, если opcache не загружен в каждый случай, когда класс загружается перед постоянным использованием. Кроме того, это не тот же файл, но либо self, либо имя класса относится к классу, который в настоящее время определен. – bwoebi

+0

@bwoebi Не думаю, что мы удалим недостижимые блоки, если opcache не загружен. И opcache также должен заменить константы класса в том же файле, даже если это не текущий класс (в отличие от постоянной сгибания в компиляторе). – NikiC

+0

Спасибо, они ключевое слово «block pass» помогли мне найти соответствующий исходный код, я обновил ваш ответ и включил ссылку на исходный файл, чтобы каждый мог извлечь из этого выгоду – skafandri

0

Просто Нет, он не устраняет никакого кода.

+0

Чувак, не разочаровывай меня так быстро :)) Любые ссылки? – skafandri

+0

просто посмотрите на сгенерированный код операции для этого скрипта https://3v4l.org/ID56m – ins0

+0

Итак, это, к сожалению, правильный ответ. – skafandri

Смежные вопросы