Есть два типа программистов: одни пишут 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. Если просто доклеить ключи, которых нет, тогда +.
Короче, знай инструменты и их подлянки. И не пиши код так, чтобы через год самому захотелось вломить себе за это по голове.
0 комментариев