двойной тернарный оператор php

Операторы сравнения

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

switch ( «a» ) <
case 0 :
echo «0» ;
break;
case «a» : // Эта ветка никогда не будет достигнута, так как «a» уже сопоставленно с 0
echo «a» ;
break;
>
?>

Для различных типов сравнение происходит в соответствии со следующей таблицей (по порядку).

Пример #1 Сравнение булево/null

Пример #2 Алгоритм сравнения обычных массивов

Сравнение чисел с плавающей точкой

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

Еще одним условным оператором является тернарный оператор «?:».

Пример #3 Присваивание значения по умолчанию

Рекомендуется избегать «нагромождения» тернарных выражений. Поведение PHP неочевидно при использовании нескольких тернарных операторов в одном выражении:

Пример #4 Неочевидное поведение тернарного оператора

// однако, он выводит ‘t’
// это происходит потому, что тернарные выражения вычисляются слева направо

// здесь вы можете видеть, что первое выражение вычисляется в ‘true’, которое
// в свою очередь вычисляется в (bool)true, таким образом возвращая истинную ветвь
// второго тернарного выражения.
?>

Источник

Порядок выполнения тернарного оператора

В php есть интересная особенность тернарного оператора — специфический и уникальный порядок выполнения.

Java и C++ тоже вернут 1

А какая вообще разница?

Я знаю об этом интересном нюансе довольно давно, но буквально вчера обнаружил ошибку в одном из открытых исходников: автор явно не знал об этом нюансе и попался. Потому, данная статья служит всего-лишь предупреждением. Ведь, если программист ожидает от php такого же поведения, как от других языков — может попасть в халепу.

Такой приём очень удобный для задания значений, зависимо от условий. Изящная замена if-else. Например:

Как избежать ошибки?

Первый способ — не использовать тернарный оператор в php.
Второй — прямо указывать порядок выполнения с помощью скобок:

Чем-то напоминает Лисп, не так ли?

Почему оно вообще так происходит?

Давайте разберемся в порядке выполнения тернарного оператора на примере JavaScript vs PHP
Напишем два тестовых скрипта, чтобы понять, как работает каждый из языков.

$ node ternary.js
cond.first
value.first
result: first

$ php ternary.php
cond.first
value.first
value.second
value.third
result: third

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *