Самоучитель: PHP под капотом: runtime и стандартная библиотека
Глава 5 из 20II. Язык как инструмент110 минут

Глава 5. Алгебра типов на границе данных

Тип полезен, когда сужает множество допустимых состояний; сложная декларация без предметного имени часто лишь переносит путаницу в сигнатуру.

После главы вы сможете
  • выбирать тип по состояниям
  • понимать strict_types
  • заменять сложный union моделью

Сырой вход не является моделью

json_decode возвращает структуру, форма которой ещё не доказана. Pulse сначала проверяет обязательные ключи, типы, диапазоны и допустимое имя события, затем создаёт Event. После этой точки остальной код не проверяет is_array в каждой функции.

mixed честно описывает неизвестный вход, но не должен распространяться глубоко. never подходит функции, которая всегда завершает процесс или выбрасывает исключение. Nullable означает конкретное допустимое отсутствие, а не «мы пока не решили».

Сужение

От неизвестного к предметномуКаждая ступень уменьшает число допустимых состояний и добавляет понятную причину отказа.mixeddecodedshapekeysscalarsrangesvalue objectsvalidhandlernarrow
Каждая ступень уменьшает число допустимых состояний и добавляет понятную причину отказа.

strict_types без магии

declare(strict_types=1) влияет на скалярные вызовы, выполненные из текущего файла. Он не валидирует массивы, не меняет источник HTTP-строк и не отменяет явные преобразования. Поэтому строгий режим — полезный предохранитель, но не слой валидации.

Возвращаемый тип проверяется при выходе функции. Внутренние функции имеют собственные правила. Код Pulse не полагается на нестрогое сравнение строкового нуля и false; результат parser выражается именованным объектом или исключением.

Union, intersection и DNF

Union A|B означает один из вариантов, intersection A&B — объект, выполняющий оба контракта. DNF позволяет сочетать пересечения внутри объединения. Если читателю трудно объяснить каждую ветвь, стоит создать предметный интерфейс или адаптер вместо наращивания сигнатуры.

Тип EventSource может скрыть файл, stdin и тестовый массив за iterable-контрактом. Это яснее, чем повторять ресурс|SplFileObject|array во всех местах и заставлять обработчик различать инфраструктуру.

Variance и замена

Параметр реализации может принимать более широкий тип, а результат — возвращать более узкий, сохраняя возможность подстановки. Практический тест прост: клиент интерфейса не должен знать, какой EventSource получил.

Типизация не заменяет semantic contract. int не сообщает единицу времени и не запрещает отрицательное значение. DurationSeconds или проверенный EventSequence делают правило видимым и локализуют преобразование.

Лаборатория

Опишите путь decoded JSON → Event. Уберите mixed после decoder boundary, замените сложный union источников интерфейсом и добавьте тесты отсутствующего ключа, неверного типа и отрицательной длительности.

  • Сигнатура ядра не содержит array без описанной формы.
  • strict_types включён во всех исходных файлах.
  • Каждый nullable имеет предметную причину.
Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Контрольная карта лаборатории

Выполнено: 0 из 3

Локальный тест

1. Что делает mixed безопасным?
2. Когда интерфейс лучше длинного union?

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/manual/en/language.types.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php.nethttps://www.php.net/manual/en/migration85.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie