Есть два типа программистов: одни пишут if/else на три экрана и гордятся «читабельностью», другие лепят всё в тернарку и радуются, что строка уложилась в ширину монитора. Первые думают, что вторые — чекнутые, вторые уверены, что первые — графоманы. Истина, как всегда, где-то между.

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

А ещё есть оператор объединения массивов (+). С виду норм, но если ты ждёшь, что он будет вести себя как array_merge — жди баги и бессонные ночи.

Тернарный оператор: сахар или говно

Синтаксис до боли прост:

$activity = $isRaining ? "Сидим с котом дома" : "Идём выгуливать кота на улицу";

Всё, точка. Никакой магии. Работает как if/else, только без пафоса.

Пример, где он действительно уместен:

$isMorning = true;
$greeting = $isMorning ? "Доброе утро!" : "Добрый вечер!";

Писать под это if в три строки — маразм.

Но если ты начинаешь вкладывать тернарки друг в друга:

$result = $a ? ($b ? "X" : "Y") : ($c ? "Z" : "W");

— знай, тебя скоро возненавидят все, кто будет читать этот код. Это уже не программист, а кроссвордист.

Тернарный оператор объединения: плюсик с подвохом

PHP-шный + для массивов выглядит заманчиво. Типа «склеим два массива в один»:

$array1 = ["a" => "green", "b" => "brown", "c" => "blue"];
$array2 = ["b" => "yellow", "d" => "black"];

$result = $array1 + $array2;
print_r($result);

И что ты видишь?

Array
(
    [a] => green
    [b] => brown
    [c] => blue
    [d] => black
)

Ага. Значение b не перезаписалось, хотя в $array2 было yellow. Потому что + работает как «дополни первый массив тем, чего у него нет». То есть он больше про объединение ключей, чем про нормальное слияние.

Если тебе реально нужно перезаписывать значения — забудь про + и юзай array_merge:

$result = array_merge($array1, $array2);

Тогда b станет yellow, как и ожидалось.

Где наступают на грабли

  • Ожидания vs. реальность.
    Многие думают, что $array1 + $array2 = array_merge. Нет. Если ключ уже есть в $array1, + его не тронет. Это тонкий баг, который всплывает в продакшене, а не в тестах.
  • Тернарка ради тернарки.
    Увидеть в коде трёхэтажную вложенность ?: — как поймать ногой гвоздь. Вроде жить можно, но больно.
  • Код для будущих археологов.
    Когда в тернарке или объединении массивов спрятаны полбизнес-логики, код перестаёт быть кодом. Это уже шарада, которую будут разгадывать твои коллеги. А они тебя за это возненавидят.

Мои выводы

Тернарный оператор — норм штука, если не превращать его в наркотик. Используй его для коротких условий, где if выглядел бы тупо. Всё остальное — в помойку.

Оператор + для массивов — не объединение, а странное дополнение. Работает быстро, но ведёт себя хитро. Если тебе надо именно «объединить с перезаписью» — array_merge. Если просто доклеить ключи, которых нет, тогда +.

Короче, знай инструменты и их подлянки. И не пиши код так, чтобы через год самому захотелось вломить себе за это по голове.