Самоучитель: PHP 8.5: инженерный практикум
Глава 5 из 22I. Надёжные примитивы90 минут

Глава 5. Функциональные контракты и читаемые конвейеры PHP 8.5

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

После главы вы сможете
  • спроектировать сигнатуру
  • отделить преобразование от эффекта
  • оценить pipe operator PHP 8.5

Сигнатура — публичное обещание

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

Значение по умолчанию является частью поведения. Не добавляйте его только ради сокращения вызова: читатель должен понимать, почему пропущенный timezone означает именно UTC, а отсутствие лимита не запускает бесконечную выборку.

Чистое ядро и эффекты

Граница функционального ядраПреобразования проверяются без инфраструктуры, а запись выполняется после успешного решения.Raw DTOinputNormalizepureCalculatepureDecidepurePersisteffect
Преобразования проверяются без инфраструктуры, а запись выполняется после успешного решения.

Callback должен сохранять смысл

array_map удобен, когда каждому элементу соответствует один результат. array_filter выбирает элементы, reduce сворачивает набор в значение. Если callback меняет внешнюю переменную, пишет в файл или зависит от текущего времени, название операции перестаёт описывать реальное поведение.

First-class callable помогает передавать существующую функцию без обёртки. Но цепочка анонимных функций не обязана быть понятнее цикла. Выбирайте форму, в которой явно видны порядок, тип промежуточного значения и обработка ошибки.

Pipe operator в PHP 8.5

<?php

$normalizedName = $rawName
    |> trim(...)
    |> collapseWhitespace(...)
    |> normalizeExerciseName(...);

Возврат нельзя терять

PHP 8.5 добавляет атрибут NoDiscard для API, где игнорирование результата похоже на ошибку. Такой сигнал полезен для immutable-операций: метод withTimezone создаёт новый объект, а не меняет старый. Атрибут не заменяет хорошее имя и тесты, но делает опасный вызов заметнее.

Исключение подходит для нарушения контракта или невозможности продолжить сценарий. Ожидаемое отсутствие результата часто лучше представить null или отдельным Result-типом — выбор зависит от того, является ли отсутствие нормальным исходом.

Лабораторная работа

Постройте чистый конвейер нормализации названия упражнения и расчёта недельного объёма. Сначала реализуйте его совместимо с PHP 8.4, затем покажите эквивалентную запись через |> как необязательный вариант 8.5.

Локальный прогресс

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

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

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

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

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

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

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

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

Аналитика

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

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

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

Политики

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