Что такое type hinting в PHP?

Ответ

Type hinting (подсказки типов) в PHP — это механизм указания ожидаемых типов данных для параметров функций, возвращаемых значений и свойств классов. Он помогает предотвратить ошибки, улучшает читаемость кода и обеспечивает лучшую поддержку в IDE.

Основные возможности:

  • Скалярные типы (с PHP 7.0): int, float, string, bool
  • Составные типы: array, iterable, callable, object
  • Nullable-типы (с PHP 7.1): ?string (означает string|null)
  • Объединённые типы (с PHP 8.0): string|int
  • Подсказки для свойств (с PHP 7.4): private string $name;

Примеры использования:

// Строгая типизация включается в начале файла
declare(strict_types=1);

// Типы для параметров и возвращаемого значения
function calculateTotal(float $price, int $quantity): float {
    return $price * $quantity;
}

// Nullable-тип и объединённый тип
function processUser(?string $name, string|int $id): void {
    // ...
}

// Типизированные свойства класса
class User {
    private string $email;
    private ?DateTime $birthDate;

    public function __construct(string $email) {
        $this->email = $email;
    }
}

Важные особенности:

  1. Без strict_types=1 PHP будет пытаться привести значения к указанным типам
  2. Со strict_types=1 передача значения неверного типа вызовет TypeError
  3. Type hinting работает во время выполнения, а не только на этапе анализа кода
  4. Это особенно полезно в больших проектах и при работе в команде

Ответ 18+ 🔞

А, ну это про эти ваши подсказки типов в PHP! Ёпта, раньше-то мы как жили? Всё в коде было как чёрт в душу мать — передай хоть строку, хоть число, хоть целый массив, функция сожрёт и не поперхнётся. А потом охуеешь, когда на продакшене всё накрывается медным тазом, потому что вместо цифры прилетела строка «десять».

Ну, в общем, придумали эту штуку, чтобы мозги не ебать. Объявляешь прямо в аргументах функции, какого хуя ты ждёшь: int, string, float. Идея-то, в принципе, здравая — сразу видно, что куда пихать, и IDE подсказывает. Но есть нюансы, блядь.

Смотри, вот базовый прикол:

declare(strict_types=1);

function calculateTotal(float $price, int $quantity): float {
    return $price * $quantity;
}

Видишь? Говорим: «Эй, функция, первый аргумент — число с точкой, второй — целое число, и, сука, вернёшь ты тоже число с точкой». Красота. А если без этой строчки declare(strict_types=1);, то PHP начнёт сам умничать и пытаться превратить твою херню в нужный тип. Передашь строку «5» — он её в число 5 превратит. А со строгим режимом — сразу получишь по шапке, TypeError, и будешь знать, что накосячил.

Дальше пошли приколы посерьёзнее. Допустим, параметр может быть, а может и не быть. Раньше писали $name = null, а теперь можно вот так элегантно: ?string $name. Это значит string или null. Удобно, ёпта.

А в восьмёрке вообще овердохуища возможностей открылось. Объединённые типы! Раньше голову ломал, как описать, что функция принимает либо строку, либо число. Теперь просто: string|int $id. И волнение ебать — сразу успокоился.

Ну и свойства классов тоже можно типизировать, с седьмой версии. Раньше объявлял свойство и гадал, что там будет лежать. А теперь прямо в коде видно:

class User {
    private string $email;
    private ?DateTime $birthDate;
}

Сразу ясно — $email всегда строка, а $birthDate либо дата, либо пусто. Никаких сюрпризов.

Главное помнить — эта вся магия работает во время выполнения. Это не просто для красоты в редакторе. Если накосячишь с типом при вызове функции — получишь ошибку по-настоящему. Особенно кайфуют большие команды, когда каждый не творит свою пиздопроебибну, а следует контракту. В общем, штука полезная. Сначала кажется, что лишняя писанина, но потом, когда проект растёт, понимаешь — без неё вообще ни хуя.