пятница, 30 мая 2014 г.

Тернарный оператор в PHP

  В качестве идеи для очередной статьи я решил выбрать тернарные операторы в PHP, а точнее, их особенность в этом языке. Всё, о чём пойдёт речь ниже, описано в официальной документации, поэтому если вы владеете знанием английского языка и перед написанием кода читаете официальную документацию, эта статья навряд ли будет вам интересной. Ну, поехали.

  Я постоянно произвожу рефакторинг (что это?) кода на своём проекте, поэтому изучение нового существующего функционала языка программирования и постоянные поиски более удобных и компактных методов записи стали для меня привычкой. Я очень часто использую условные операторы if () {...} else {...}, и большая их часть предназначена для простого вывода на страницу того или иного результата. Как мне казалось, такое использование условных операторов крайне не оправдано и код наверняка можно сократить. И на этот счёт я был прав.

  В PHP есть такое понятие как тернарный оператор. По сути, тернарные операторы выполняют те же действия, что и конструкции вида
if (true) echo $var1; else echo $var2;
Записать это же выражение в более компактном виде можно так
echo (true) ? $var1 : $var2;
С помощью него можно также и присвоить переменной определённое значение в зависимости от условия
$var3 = (true) ? $var1 : $var2;
Или в таком виде, когда помимо других переменных в переменную добавляется что-то ещё
$var3 = 'Немного текста ... '.((true) ? $var1 : $var2);
При использовании if () {} else {} эта запись выглядела бы так (эквивалентна ей)
if (true)
    $var 3 = 'Немного текста ... '.$var1;
else
    $var 3 = 'Немного текста ... '.$var2;
  В производительности тернарные операторы проигрывают операторам if и else, хоть и самую малость: при 10 миллионах операций заметно, что тернарные операторы работают медленнее своей альтернативы примерно на одну шестую/восьмую от времени выполнения скрипта. Но поскольку на моём проекте нет циклов с таким числом итераций, я смирился с незначительной и незаметной на глаз медлительностью, начав применять тернарный оператор при каждом удобном случае.

  С использованием тернарного оператора при значениях истина и ложь мы разобрались, а можно ли использовать его при трёх и более условиях? Можно!
if ($var == 1)
    $arr[] = 'a';
else if ($var == 2)
    $arr[] = 'b';
else
    $arr[] = 'c';
Всё это можно записать в более компактном виде так
echo ($var == 1) ? 'a' : (($var == 2) ? 'b' : 'c');
Следует обратить внимание на расстановку круглых скобок. Запись выше не эквивалентна такой записи
echo ($var == 1) ? 'a' : ($var == 2) ? 'b' : 'c';
  Это описано в официальной документации. Вот простой пример, наглядно демонстрирующий необходимость ограничивающих скобок
$var = 1;

echo ($var == 1) ? 'a' : (($var == 2) ? 'b' : 'c'); // a
echo ($var == 1) ? 'a' : ($var == 2) ? 'b' : 'c'; // b
  Собственно, именно этот факт стал для меня скрытой особенностью языка. На деле я пока не использую тернарный оператор для трёх и более условий, так как тут уже начинает страдать удобство чтения кода. Вполне вероятно, кому-то эта заметка может пригодиться.

Комментариев нет:

Отправить комментарий