PHP: Магия аргументов (Nullable и Вариативность)
Чтобы не гадать через полгода, зачем в коде стоят вопросы и точки, вот краткий путеводитель по современным аргументам функций.
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. - Никаких дублей контента: один товар — одна правильная ссылка.
Важлива інформація
України
втрати противника
орієнтовно склали: