Возможности функций
Кроме параметров и возврата значения, у функций PHP есть возможности, которые делают вызовы понятнее, а сами функции — гибче.
Именованные аргументы
При вызове можно указать имя параметра. Тогда порядок аргументов не важен, а необязательные параметры можно пропускать:
<?php
function createUser(string $name, int $age = 18, bool $admin = false)
{
return $name . ' ' . $age . ' ' . ($admin ? 'admin' : 'user');
}
echo createUser(name: 'Анна', admin: true); // Анна 18 adminБез имён пришлось бы передать и возраст, хотя менять его не нужно.
Переменное число аргументов
Три точки перед параметром собирают все оставшиеся аргументы в массив:
<?php
function sum(...$numbers)
{
return array_sum($numbers);
}
echo sum(1, 2, 3), "\n"; // 6
echo sum(10, 20); // 30Распаковка массива
Те же три точки при вызове делают обратное — раскладывают массив по аргументам:
<?php
function volume($width, $height, $depth)
{
return $width * $height * $depth;
}
$box = [2, 3, 4];
echo volume(...$box); // 24Передача по ссылке
Обычно функция получает копию значения, и исходная переменная не меняется. Знак & перед параметром передаёт саму переменную:
<?php
function addBonus(array &$scores)
{
foreach ($scores as $key => $score) {
$scores[$key] = $score + 10;
}
}
$scores = [70, 85];
addBonus($scores);
echo implode(', ', $scores); // 80, 95Так работают встроенные sort() и shuffle(). В своём коде чаще возвращайте новое значение — это понятнее.
Статические переменные
Обычная переменная функции исчезает после вызова. Переменная со словом static сохраняет значение между вызовами:
<?php
function nextId()
{
static $id = 0;
$id++;
return $id;
}
echo nextId(), nextId(), nextId(); // 123Рекурсия
Функция может вызвать саму себя. Обязательно нужно условие, при котором вызовы прекратятся:
<?php
function factorial(int $number): int
{
if ($number <= 1) {
return 1;
}
return $number * factorial($number - 1);
}
echo factorial(5); // 120Рекурсия удобна для вложенных структур: дерева категорий, папок с файлами.
Частая ошибка
Именованные аргументы должны идти после обычных. Смешать порядок нельзя:
<?php
function greet(string $greeting, string $name)
{
return "$greeting, $name!";
}
// Неправильно: greet(name: 'Анна', 'Привет');
// Fatal error: Cannot use positional argument after named argument
echo greet('Привет', name: 'Анна'); // Привет, Анна!И помните: имена параметров становятся частью функции. Переименуете параметр — сломаются вызовы с его именем.