Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Возможности функций

Кроме параметров и возврата значения, у функций 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: 'Анна'); // Привет, Анна!

И помните: имена параметров становятся частью функции. Переименуете параметр — сломаются вызовы с его именем.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.