Ответ
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;
}
}
Важные особенности:
- Без
strict_types=1PHP будет пытаться привести значения к указанным типам - Со
strict_types=1передача значения неверного типа вызоветTypeError - Type hinting работает во время выполнения, а не только на этапе анализа кода
- Это особенно полезно в больших проектах и при работе в команде
Ответ 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 либо дата, либо пусто. Никаких сюрпризов.
Главное помнить — эта вся магия работает во время выполнения. Это не просто для красоты в редакторе. Если накосячишь с типом при вызове функции — получишь ошибку по-настоящему. Особенно кайфуют большие команды, когда каждый не творит свою пиздопроебибну, а следует контракту. В общем, штука полезная. Сначала кажется, что лишняя писанина, но потом, когда проект растёт, понимаешь — без неё вообще ни хуя.