В чем разница между Switch-Case и If-Else в PHP?

Я решаю, следует ли использовать if / else vs switch / case на PHP-сайте, который я пишу, и мне было интересно, есть ли какие-либо преимущества для использования того или другого, или если были определенные случаи, когда один из них предназначался для использования а не другой.

Интересный вопрос, потому что на скомпилированном языке (или даже на JIT'е языке) есть хорошая производительность при использовании операторов switch, потому что компилятор может создавать таблицы перехода и работать в постоянное время. Даже включение строки может быть оптимизировано, поскольку строка может быть хеширована. Однако из того, что я прочитал, похоже, что php не делает такой оптимизации (я предполагаю, потому что она интерпретируется и выполняется по строкам).

Отличная статья .Net об оптимизации коммутатора: если против скорости коммутатора

Что касается интерпретации php, в документах PHP говорится: http://php.net/manual/en/control-structures.switch.php

Важно понять, как выполняется оператор switch, чтобы избежать ошибок. Оператор switch выполняет строку за строкой (фактически, оператор-оператор). В начале код не выполняется. Только когда оператор case найден со значением, которое соответствует значению выражения switch, PHP начинает выполнять инструкции. PHP продолжает выполнять инструкции до конца блока коммутатора или в первый раз, когда видит оператор break. Если вы не напишете оператор break в конце списка операторов case, PHP продолжит выполнение утверждений следующего случая.

Я также нашел несколько ссылок, в которых говорится, что if / else-выражения в php могут быть быстрее операторов switch (странно). Это, вероятно, неверно, если вы скомпилируете php (что-то я никогда не делал, но, по-видимому, это возможно).

http://www.fluffycat.com/PHP-Design-Patterns/PHP-Performance-Tuning-if-VS-switch/

Эта статья, в частности, http://php100.wordpress.com/2009/06/26/php-performance-google/ , интересна тем, что автор сравнивает внутренний php-код, если vs-переключатель, и они почти идентичны.

В любом случае, я бы сказал, что любое увеличение производительности будет незначительным в том или ином виде, так что это больше зависит от пользователя. Если утверждения более гибкие, и вы можете более легко захватывать диапазоны значений (особенно большие диапазоны), а также выполнять более сложные сравнения, тогда как операторы switch выстраиваются в линию до одного значения.

Оператор switch-case включает только значение данного выражения. Это очень удобно, если у вас есть много (я бы сказал, даже более двух) возможных действий для решения. Итак, если у вас есть несколько дискретных значений переменной и некоторый код для выполнения для каждого из этих значений, скорее всего, оператор switch-case.

С другой стороны, если у вас более сложный тест, чем простое равенство, или если есть только две возможности, if-else, вероятно, лучше.

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