Что будет, если Junior разработчик назовёт псевдо-типы?

Ответ

На собеседовании я бы рассказал о своём опыте изучения системы типов 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;
}

В общем, урок был ценный. Теперь я знаю: прежде чем тыкать в код новый тип из документации, надо проверить, не манда ли с ушами. Всегда гоняю такие штуки на практике, а не верю на слово. Иначе будет вам не Хиросима, а нигерсраки в рантайме.