Если ты думал, что типы объединения превратят твой 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 такой крутой».