Два мира одного значения
Строка '42' из формы и целое число 42 могут выглядеть одинаково, но допускают разные операции. На границе приложения сырое представление проверяется и преобразуется; внутри сценария код работает с уже установленным типом. Это уменьшает число мест, где приходится помнить о пустой строке, локали и нестрогом сравнении.
declare(strict_types=1) влияет на скалярные вызовы из текущего файла, но не превращает PHP в язык без динамики. Массив по-прежнему способен содержать разные значения, а JSON и HTTP приходят без ваших предметных гарантий.
Конвейер входа
Строгое сравнение по смыслу
Используйте === как исходный выбор и переходите к другому сравнению только с ясной причиной. Особенно важно различать false, 0, пустую строку и null: многие функции используют false как отказ, а ноль является допустимой позицией или количеством.
Не заменяйте предметное условие общей проверкой empty(). Она объединяет несколько разных состояний и стирает причину отказа. Лучше назвать каждую ветвь: отсутствует, неверный формат, выходит за диапазон, запрещено правилом.
Функция как обещание
<?php
declare(strict_types=1);
function shippingCost(int $weightGrams, bool $express): int
{
if ($weightGrams <= 0) {
throw new InvalidArgumentException('Вес должен быть положительным');
}
$base = $weightGrams <= 1000 ? 350 : 550;
return $express ? $base + 400 : $base;
}Массивы и допустимые состояния
Массив PHP удобен на границе: он естественно представляет JSON, строку результата PDO или набор формы. Но внутри сложной модели массив не сообщает, какие ключи обязательны и какие сочетания разрешены. Когда число неявных условий растёт, создайте небольшой value object или DTO с конструктором, который не допускает половинчатого состояния.
match полезен для закрытого набора вариантов, потому что сравнивает строго и требует обработать значение либо через default, либо через все ветви. Не используйте default бездумно: новый статус иногда должен сломать тест, а не попасть в старое поведение.
Ошибки как часть потока
Предсказуемый отказ пользователя оформляйте предметным результатом или исключением на границе сценария. Неожиданную техническую ошибку журналируйте с correlation id и превращайте в нейтральный HTTP-ответ. Оператор @ и пустой catch не исправляют проблему — они удаляют наблюдаемость.
finally подходит для освобождения ресурса, но не для сокрытия результата. Если код открыл транзакцию, путь успеха делает commit, путь исключения — rollback, после чего исходная ошибка продолжает движение.
Практика главы
Напишите функцию разбора количества товара из строки. Разведите отсутствие поля, нецелый формат, ноль и превышение остатка. Затем передайте в расчёт только int.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/manual/en/migration85.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .