Ответ
На собеседовании я бы рассказал о своём опыте изучения системы типов PHP. Когда я только начинал, я столкнулся с понятием "псевдо-типов" (pseudo-types) в документации, таких как number или numeric. Я попытался использовать number в объявлении типа аргумента, и это закончилось фатальной ошибкой Fatal error: Uncaught TypeError.
Этот опыт заставил меня глубже разобраться. Я узнал, что:
numberиnumeric— это документационные подсказки, а не реальные типы. В коде нужно использовать объединённые типы, напримерint|float.- Некоторые псевдо-типы со временем стали реальными:
iterable(с PHP 7.1),mixed(с PHP 8.0). voidможно использовать только как тип возвращаемого значения.
Пример из моего кода:
// Так нельзя (number - псевдо-тип)
// function calculateTax(number $amount) { ... }
// А так правильно:
function calculateTax(int|float $amount): float {
return $amount * 0.2;
}
Эта ошибка была полезным уроком, который научил меня всегда проверять документацию на актуальность и тестировать предположения на практике.
Ответ 18+ 🔞
А, ну это классика, ёпта! Расскажу тебе, как я на грабли системы типов в PHP наступал, ебать мои старые костыли.
Начинал-то я, как все, с документации. Читаю там про типы, а там такие красавцы — number, numeric. Ну я, дурак, думаю: "О, круто! Значит, можно указать number, и туда и целое число, и дробное залетит, хитрая жопа!" И давай в коде писать:
function calculateTax(number $amount) { ... }
Ага, щас! Запускаю — бац! И мне в ответ Fatal error: Uncaught TypeError. Сам от себя охуел. Оказалось, что я, как тот самый мартышлюшка, клюнул на псевдо-типы. Это же просто подсказки для документации, а не реальные типы для кода! Настоящий пиздец, доверия к документации после этого — ноль ебать.
Пришлось разбираться, терпения ноль ебать, но разобрался. Вот что выяснил:
numberиnumeric— это так, для красоты в мануале написано. В реальности надо юзать объединённые типы, типаint|float.- Но есть и те псевдо-типы, которые выросли и стали настоящими:
iterable(с PHP 7.1),mixed(с PHP 8.0). Вот это уже дело. - А
void— тот вообще особый случай, его только как тип возврата можно пихать, никуда больше.
Исправленный пример, который теперь работает:
// Так нельзя (number - псевдо-тип)
// function calculateTax(number $amount) { ... }
// А так правильно:
function calculateTax(int|float $amount): float {
return $amount * 0.2;
}
В общем, урок был ценный. Теперь я знаю: прежде чем тыкать в код новый тип из документации, надо проверить, не манда ли с ушами. Всегда гоняю такие штуки на практике, а не верю на слово. Иначе будет вам не Хиросима, а нигерсраки в рантайме.