Функция PHP объявляется ключевым словом function, именем, списком параметров и телом; return отправляет значение обратно вызывающему коду. function add(int $a, int $b): int { return $a + $b; } объявляет функцию, а add(2, 3) вызывает её и возвращает 5.
string и int перед параметрами это объявления типов, а : string после скобок это тип возвращаемого значения. И то, и другое необязательно, но они рано ловят ошибки и документируют, чего функция ожидает.
Возвращаемые значения и возврат нескольких значений
return сразу завершает функцию. Функция без return или с пустым return; возвращает null; объявляйте : void, когда её вызывают только ради действия. Функция возвращает одно значение, но им может быть массив, который вы деструктурируете на стороне вызова:
Другие формы [...] = описаны в деструктуризации массива.
Параметры по умолчанию и именованные аргументы
Параметр с = value необязателен: вызывающий код может его опустить. Необязательные параметры идут после обязательных. Начиная с PHP 8.0 именованные аргументы позволяют передать любой параметр по имени, поэтому ненужные необязательные можно пропустить.
Именованные аргументы делают читаемыми и вызовы встроенных функций: str_pad('7', 3, '0', pad_type: STR_PAD_LEFT). Имя параметра становится частью публичного интерфейса функции, поэтому переименование параметра может сломать код, который вызывает её по именам.
Передача по ссылке
Обычно PHP передаёт копию каждого аргумента, поэтому функция не может изменить переменную вызывающего кода. & перед параметром передаёт саму переменную. Так работают встроенные функции вроде sort().
Вернуть новое значение обычно понятнее, чем менять аргумент. Используйте ссылки, когда функция действительно должна что-то изменить на месте.
Объявления типов и strict_types
По умолчанию PHP приводит аргументы к объявленному типу, когда может: add("5", 3) превращает "5" в 5. declare(strict_types=1); в самом начале файла отключает это для вызовов из этого файла, и неверный тип выбрасывает TypeError, а не приводится.
Без строки declare тот же вызов выводит 8. Строки, которые не являются числами, например "five", выбрасывают TypeError в обоих режимах.
Типы, которые можно объявлять для параметров и возвращаемых значений:
never это тип возвращаемого значения для функций, которые всегда выбрасывают исключение или завершают скрипт. Имена классов и интерфейсов тоже работают как типы.
Переменное число аргументов через ...$args
...$numbers собирает любое число аргументов в массив. Те же ... на стороне вызова распаковывают массив в отдельные аргументы.
Внешняя переменная внутри функции
У функции своя область видимости. Переменная, объявленная снаружи, внутри не видна, и это удивляет тех, кто пришёл из JavaScript:
<?php
$taxRate = 0.2;
function priceWithTax(float $price): float
{
return $price * (1 + $taxRate); // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6
и функция возвращает цену без налога. Вместо этого передайте значение параметром. Так функция честно показывает, от чего зависит, и её легко тестировать:
Ключевое слово global тоже работает, но прячет зависимость; оно описано в разделе об области видимости переменных. Для коротких функций, которые передаются в другие функции, например колбэков для array_map(), смотрите анонимные функции: они могут захватывать внешние переменные через use.
Часто задаваемые вопросы
Как объявить функцию в PHP?
Используйте ключевое слово function, имя, параметры в скобках и тело: function add(int $a, int $b): int { return $a + $b; }. Вызывайте её как add(2, 3). Имена функций не чувствительны к регистру, а функцию, объявленную на верхнем уровне файла, можно вызвать раньше строки, где она объявлена.
Как вернуть несколько значений из функции PHP?
Верните массив и деструктурируйте его: function minMax(array $a): array { return [min($a), max($a)]; }, затем [$min, $max] = minMax([3, 1, 4]);. Для именованных результатов возвращайте ассоциативный массив и используйте ['min' => $min] = ....
Что делает declare(strict_types=1)?
Отключает автоматическое приведение типов для вызовов из этого файла, поэтому передача "5" в параметр int выбрасывает TypeError, а не превращается в 5. Эта инструкция должна стоять первой в файле и действует только на этот файл.
Что такое именованные аргументы в PHP?
Начиная с PHP 8.0 аргументы можно передавать по имени параметра: htmlspecialchars($s, double_encode: false). После позиционных их можно указывать в любом порядке, и они позволяют пропускать необязательные параметры, которые не нужно менять.
Как передать переменную по ссылке в PHP?
Поставьте & перед параметром: function addOne(int &$n): void { $n++; }. Тогда функция меняет переменную вызывающего кода. Без & PHP передаёт копию, и переменная вызывающего кода остаётся прежней.