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

Глава 2. Значения, единицы измерения и точная арифметика

Число без единицы двусмысленно: 90 может означать секунды, минуты, килограммы или процент, поэтому корректность начинается с именования и диапазона.

После главы вы сможете
  • развести представление и смысл
  • избежать неявной арифметики
  • закрепить инвариант в функции

Тип не равен предметному смыслу

int сообщает, какие операции доступны машине, но не объясняет, что хранится внутри. $duration, $durationMinutes и $durationSeconds создают три разных уровня ясности. На HTTP-границе приходит строка; после проверки приложение работает с целым количеством секунд.

Для денежных значений и других точных десятичных величин float опасен из-за двоичного представления. Храните минимальные целые единицы либо используйте подходящую decimal-библиотеку. Вес тренировки можно хранить в граммах, а показывать в килограммах только при форматировании.

Преобразование значения

Жизненный цикл числового вводаЕдиница и допустимый диапазон устанавливаются до передачи значения предметной логике.Строкаиз формыФорматцифрыДиапазонправилоЕдиницасекундыМодельDuration
Единица и допустимый диапазон устанавливаются до передачи значения предметной логике.

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Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

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

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

Аналитика

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

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

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

Политики

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