Тип не равен предметному смыслу
int сообщает, какие операции доступны машине, но не объясняет, что хранится внутри. $duration, $durationMinutes и $durationSeconds создают три разных уровня ясности. На HTTP-границе приходит строка; после проверки приложение работает с целым количеством секунд.
Для денежных значений и других точных десятичных величин float опасен из-за двоичного представления. Храните минимальные целые единицы либо используйте подходящую decimal-библиотеку. Вес тренировки можно хранить в граммах, а показывать в килограммах только при форматировании.
Преобразование значения
Null должен отвечать на вопрос
null уместен, когда отсутствие является отдельным допустимым состоянием: тренировка ещё не завершена, поэтому finishedAt неизвестен. Он не должен скрывать ошибку преобразования, потерянное поле или невозможность соединения с базой.
Не объединяйте 0, пустую строку, false и null через empty(), если состояния имеют разный смысл. Нулевая нагрузка может быть валидной для разминки, а пустая строка означает, что пользователь ничего не ввёл. Явные ветви дают точное сообщение и точный тест.
Функция с единицей в контракте
<?php
declare(strict_types=1);
function trainingVolumeKg(int $weightGrams, int $repetitions): float
{
if ($weightGrams < 0 || $repetitions < 0) {
throw new InvalidArgumentException('Значения не могут быть отрицательными');
}
return ($weightGrams * $repetitions) / 1000;
}
echo trainingVolumeKg(12_500, 8);Что изменилось в современном PHP
Строгие типы полезны на внутренних границах, однако PHP остаётся динамическим: массивы и декодированный JSON требуют самостоятельного контракта. В PHP 8.5 неканонические имена приведений вроде integer и boolean устарели; используйте int и bool и проверяйте migration guide до обновления.
Не превращайте каждое значение в класс автоматически. Value object оправдан, когда у значения есть повторяющийся инвариант, форматирование или несколько операций. Одноразовая локальная переменная с точным именем часто понятнее лишнего слоя абстракции.
Лабораторная работа
Опишите длительность тренировки, вес снаряда и число повторений. Для каждого значения укажите внешний формат, внутреннюю единицу, допустимый диапазон и поведение при отсутствии.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/migration85.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .