Сырой вход не является моделью
json_decode возвращает структуру, форма которой ещё не доказана. Pulse сначала проверяет обязательные ключи, типы, диапазоны и допустимое имя события, затем создаёт Event. После этой точки остальной код не проверяет is_array в каждой функции.
mixed честно описывает неизвестный вход, но не должен распространяться глубоко. never подходит функции, которая всегда завершает процесс или выбрасывает исключение. Nullable означает конкретное допустимое отсутствие, а не «мы пока не решили».
Сужение
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 этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/manual/en/language.types.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/migration85.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .