РекомендуетсяPHP 8.2+

PHP: типы и проверка входных значений

В новом PHP-коде описывайте типы параметров, возврата и свойств, а на внешней границе отдельно проверяйте значение. strict_types и тип int не заменяют проверку положительного количества или допустимого ID.

Опубликовано Проверено Изменено

Плохо

function quantity($value) {
    return (int) $value; // "12items" становится 12, null становится 0.
}
$count = quantity($request['quantity']);

Хорошо

<?php
declare(strict_types=1);
 
namespace Project\Order;
 
function requireQuantity(mixed $value): int
{
    if (!is_int($value) || $value < 1) {
        throw new \InvalidArgumentException('quantity must be a positive integer');
    }
    return $value;
}
// Для JSON-контракта: requireQuantity(3) -> 3.
// Строка "3", null, float и массив отвергаются без приведения.

Почему это важно

Native-типы ловят несоответствие формы данных, а доменная проверка ограничивает их смысл. Приведение до проверки может скрыть исходную ошибку. Nullable-тип разрешает null, но не говорит, что поле запроса можно не передавать.

Когда применять

Baseline примера — PHP 8.2+, JSON quantity целого типа. declare(strict_types=1) включается по файлам для нового контролируемого кода; для скалярных аргументов режим определяется вызывающим файлом. Один strict-файл не переводит весь legacy-проект в строгий режим, а внутренние PHP-вызовы имеют свои особенности.

HTML/query обычно дают строки: если контракт их допускает, разбирайте их явно с проверкой формата, диапазона PHP_INT_MAX и нужных ограничений. Это иной адаптер, а не повод делать mixed во всей бизнес-логике. После адаптера используйте конкретный тип или небольшой объект значения.

Типы массивов PHP не проверяют форму каждого элемента; где нужна структура, добавьте DTO/валидацию и документируйте shape для анализатора. Не принимайте docblock за runtime validation. Выбирайте nullable/union по реальным исходам; не добавляйте false|null|array только ради сокрытия ошибок.

Сигнатуры переопределенных методов, hook/callback и публичного API меняйте с учетом совместимости. PHP-язык не требует PSR naming; WordPress и Bitrix legacy не обязаны автоматически получить новые сигнатуры.

Кто что делает

Человек

Утверждает входные форматы и политику совместимости legacy-кода.

AI-агент

Разделяет типизацию и валидацию, сверяет минимальную версию PHP и вызывающую сторону strict_types.

Как проверить у себя

Вход и действиеОжидаемый результатСвидетельство
requireQuantity(3)Возвращает int 3Unit-тест на baseline PHP
0, -1, "3", "12items", null, 3.5, массивКаждый отвергнут до бизнес-операцииТаблица случаев
Строковый HTTP-адаптер с числом больше PHP_INT_MAXЯвный отказ без переполнения/усеченияГраничный тест адаптера
Вызов typed-функции из strict и non-strict файловЗафиксировано различие coercion; политика не полагается на один callee-файлДва отдельных файла теста
Изменена сигнатура legacy hookСохранен контракт всех вызывающих сторонПроверка интеграции с платформой

Эти сценарии предназначены приложению; PHP runtime в редакционной среде отсутствует.

ПервоисточникиИстория изменений на GitHub

Дата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.