Слава Україні!

PHP: Магия аргументов (Nullable и Вариативность)

Краткий путеводитель по современным аргументам функций
17-го січня 2026, 16:27

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

1. Конструкция ?int $id = null

Это комбо из двух разных настроек: типа и обязательности. Они не дублируют, а дополняют друг друга.

  • Знак вопроса (?int) — это разрешение на "пустоту". Он говорит: «В этой переменной я жду либо целое число, либо ничего (null)». Без этого вопроса, если попытаться передать null явно, PHP выдаст ошибку.
  • Равно нуль (= null) — это разрешение "промолчать". Оно делает аргумент необязательным. Можно вообще не передавать ничего при вызове функции: func().

Зачем оба? С версии PHP 8.4 язык требует явности: если стоит дефолт null, то и тип обязан быть помечен знаком вопроса. Это правило хорошего тона и защита от ошибок в будущем.


2. Неопределенное количество (...$vars)

Когда заранее неизвестно, сколько данных прилетит в функцию, на помощь приходит троеточие (оператор spread).

Внутри функции все эти "лишние" аргументы сами упаковываются в обычный массив. С ним можно работать через foreach или count().

function addTags(...$names) {
    // $names — это массив всех переданных слов
    foreach ($names as $name) {
        echo "#" . $name;
    }
}

addTags('php', 'web', 'notes'); // Выведет три тега
addTags(); // Сработает вхолостую, ошибок не будет

3. Смешиваем: Главный и остальные

Иногда нужен один обязательный параметр, а за ним — любая пачка дополнительных данных.

function logMessage(string $type, string ...$details) {
    echo "[$type]: " . implode(', ', $details);
}

logMessage('ERROR', 'File not found', 'Line 42', 'User: Admin');

Как это понимать "по-человечески":

  • Первый аргумент ($type) — это "строгий контролер". Без него функция даже не запустится.
  • Вариативный хвост (...$details) — это "свободные слушатели". Их может быть толпа, а может не быть ни одного.
  • Важно: "Хвост" всегда должен быть в конце. Нельзя поставить троеточие в начале или в середине списка аргументов — PHP просто не поймет, где заканчивается список "дополнительных" и начинается следующий конкретный параметр.

4. Практический пример: Защита от дублей (SEO)

Использование ?int $id = null идеально подходит для универсальных методов в репозиториях. Это помогает избежать ситуации, когда один и тот же товар открывается по разным ссылкам (что не нравится поисковикам).

public function getProduct(string $slug, ?int $catalog_id = null)
{
    $query = Product::where('slug', $slug);

    // Если контекст каталога передан — фильтруем жестко.
    // Если нет (например, в поиске) — отдаем товар из любой категории.
    return $query->when($catalog_id, function ($q) use ($catalog_id) {
        return $q->where('catalog_id', $catalog_id);
    })->findOrFail();
}

Почему это круто для SEO:

  • Если пользователь (или бот) попытается открыть /овощи/яблоко, а ID категории "овощи" не совпадет с категорией яблока в базе — функция сразу выдаст 404.
  • Никаких дублей контента: один товар — одна правильная ссылка.

Важлива інформація

Міністерство оборони
України
з 24.02 по 14.07
втрати противника
орієнтовно склали:
1421810 ( +1120 ) особового складу
12131 ( +6 ) танків
24932 ( +1 ) бойових бронемашин
45911 ( +46 ) артилерійських систем
1931 ( +2 ) РСЗВ
1491 ( +2 ) засоби ППО
437 ( +0 ) літаків
353 ( +0 ) гелікоптерів
119862 ( +330 ) автомобільної техніки
33 ( +0 ) кораблі / катери
4899 ( +3 ) крилаті ракети
407201 ( +1508 ) БПЛА
4416 ( +4 ) спец. техніки
1905 ( +11 ) установок ОТРК/ТРК
2 ( +0 ) підводні човни