Если ты думал, что типы объединения превратят твой PHP-код в строгий и аккуратный, забудь. Они просто помогают IDE и твоему мозгу понять, что за фигня у тебя в переменной. Если код кривой, никакие int|string не спасут — он всё равно будет ломаться.
PHP 8 наконец-то ввёл что-то вроде здравого смысла в хаосе типов. До этого PHP любил быть гибким до абсурда: функция вернёт тебе что угодно — строку, число, объект или вообще null, и тебе лишь бы не упасть. Теперь есть mixed, never, noreturn, object и ещё к чертовой матери куча комбинаций.
Тип mixed
mixed — это что-то вроде «могу быть кем угодно, и да, это будет больно для тех, кто читает код».
function getValue(bool $condition): mixed {
if ($condition) {
return "Hello, World!";
} else {
return 42;
}
}
$value = getValue(true); // может быть строкой или числом Пример жизненный: пишешь функцию, которая иногда возвращает объект, иногда строку, иногда null — и не хочешь забивать себе голову отдельными типами. IDE чуть меньше ругается, а ты не сходишь с ума.
Но предупреждение: mixed — это, по сути, кодовая спичка. Пользуйся осторожно, иначе через месяц будешь лазать в дебаге и материться на «не тот тип в переменной».
Тип never
never — крутая штука для тех случаев, когда функция всегда выкидывает исключение или садится в бесконечный цикл.
function throwException(): never {
throw new Exception("Что-то пошло не так");
}
Если ты пытаешься вернуть что-то из такой функции — забудь. Тип never говорит компилятору: «Слушай, с этой функцией никогда ничего не вернётся, так что не жди чудес».
Тип noreturn
noreturn — почти то же самое, что never, только для exit() и die().
function terminate(): noreturn {
exit("Завершаем скрипт");
}
Просто и честно: если вызвал terminate(), код ниже не выполнится. Всё. Без магии.
Тип object
object — для тех, кто любит возвращать объекты любых классов.
function getObject(): object {
return new stdClass();
}
$obj = getObject(); // объект stdClass Полезно, когда функция может отдавать разные объекты, но ты хочешь, чтобы IDE хотя бы понимала, что это не число и не строка.
Использование типов объединения
PHP 8 позволяет делать вот так:
class Example {
public int|string $property;
public function setProperty(int|string $value): void {
$this->property = $value;
}
}
Теперь $property может быть и числом, и строкой. Метод setProperty это понимает. Никаких сюрпризов, если кто-то захочет сунуть туда массив или объект — PHP плюётся сразу.
Типы объединения реально полезны для безопасности и читаемости кода. Без них IDE и ты сами придумываете, что именно вернёт функция, а это всегда боль.
Где это реально помогает
- Когда функция возвращает разные типы — например, ID или объект.
- Когда нужно строго разграничить, что функция может выйти только через
exit()или выбросить исключение. - Когда читаешь чужой код и пытаешься понять, что к чему. Без типизации это как гадать по кофейной гуще.
Лайфхаки
mixed— используй, когда действительно лень думать о типах, но будь готов к дебагу.neverиnoreturn— идеальны для функций-катастроф.object— если возвращаешь объекты разных классов.int|stringи подобные — это не магия. Это всего лишь страховка от чужого кривого кода.
Итог
Типы объединения в PHP — инструмент, а не панацея. Они помогают делать код чуть менее хаотичным, но если у тебя архитектура — сплошной ад, они не спасут.
Используй их там, где реально есть смысл, а не ради того, чтобы «PHP 8 такой крутой».
0 комментариев