Коротко: передать функцию в функцию в PHP можно тремя способами: по имени строкой, анонимной функцией или стрелочной функцией. Параметр объявляют типом callable, а внутри вызывают принятую функцию. Часто такой приём применяют в usort, array_map и array_filter.
Способы передать
| Способ | Пример |
|---|---|
| По имени | 'strtoupper' |
| Анонимная | function () { } |
| Стрелочная | fn($x) => $x * 2 |
| Массив-метод | [$obj, 'method'] |
Пример
php
function apply(array $items, callable $fn) {
$result = [];
foreach ($items as $item) {
$result[] = $fn($item);
}
return $result;
}
echo implode(', ', apply([1, 2, 3], fn($n) => $n * 2));
// 2, 4, 6Функция apply() не знает, что именно делать с элементом, — это определяет переданная функция. Так одна функция решает разные задачи.
Вкладки: на практике
php
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);Здесь правило сортировки передают прямо в usort. Одна функция сортирует по любому полю — достаточно поменять callback.
php
$squares = array_map(fn($n) => $n * $n, [1, 2, 3]);
$evens = array_filter([1, 2, 3, 4], fn($n) => $n % 2 === 0);array_map и array_filter принимают функцию и применяют её к элементам. Это самый частый случай передачи функции в функцию.
php
$tax = 0.2;
$withTax = array_map(
function ($price) use ($tax) {
return $price * (1 + $tax);
},
$prices
);Замыкание — анонимная функция, которая «запоминает» внешние переменные через use. Так в обработку передают дополнительные данные.
callable не гарантирует, что функция найдётся: если передать несуществующую функцию по имени, будет ошибка при вызове. Проверяйте через is_callable(), если данные приходят извне.Практика: передать функцию
- Определите, что должна делать переданная функция.
- Объявите параметр с типом
callable. - Вызовите его внутри своей функции.
- Для простой логики используйте стрелочную функцию.
- Для внешних данных — замыкание с
use. - Проверьте работу на примерах.
Частые ошибки: причина → решение
| Симптом | Причина | Решение |
|---|---|---|
| «Call to undefined function» | неверное имя | проверить is_callable |
| Ошибка типа аргумента | передан не callable | передать функцию |
| Нет внешней переменной | забыт use |
добавить use ($var) |
| Неожиданный результат | неверная логика callback | проверить на примерах |
| Медленно на больших данных | тяжёлая функция в цикле | упростить или кэшировать |
Проверьте себя
use?
Вопросы и ответы
Это функция, которую передают в другую функцию и вызывают внутри неё. Так основная функция становится универсальной, а поведение задаётся снаружи.
Стрелочная функция fn короче и автоматически захватывает внешние переменные. Она подходит для короткой логики в одну строку; для больших блоков используют обычную анонимную функцию.
Да, в виде массива [$object, 'methodName'] или строкой 'ClassName::method'. Это удобно, когда обработка уже оформлена методом.
В функциях работы с массивами: array_map, array_filter, usort, array_reduce. Также в событиях и обработчиках.
Итоги
- Функцию в функцию передают по имени, анонимно или стрелочной.
- Параметр объявляют типом
callable. - Замыкание захватывает внешние переменные через
use. - Приём широко применяют в функциях обработки массивов.
Комментарии
Пока комментариев нет — будьте первым, кто поделится мнением.