W3docs

Callback-функции в PHP

Узнайте, что такое callback-функции в PHP, зачем они нужны и как их использовать с array_map, array_filter, usort и методами объектов.

Callback (или «callable») — это функция, которую вы передаёте в другую функцию, чтобы та вызвала её позже. Callbacks являются основой функций высшего порядка в PHP — array_map, usort, array_filter и множество хуков фреймворков принимают callback в качестве аргумента. В этой главе объясняется, что считается callable в PHP, рассматриваются четыре способа написания callback-функций и их применение в повседневном коде.

Предполагается, что вы уже знакомы с базовыми функциями PHP. Если вы новичок в определении функций, сначала прочитайте эту главу.

Что такое callback-функции в PHP?

Callback-функция в PHP — это любая функция, передаваемая в качестве аргумента другой функции и вызываемая внутри неё. PHP распознаёт значение как callable в четырёх формах:

  • Строка с именем функции'strtoupper' ссылается на встроенную функцию strtoupper().
  • Анонимная функция (замыкание)function () { ... }, присвоенная переменной или переданная напрямую.
  • Стрелочная функцияfn() => ..., сокращённый синтаксис для коротких замыканий (PHP 7.4+).
  • Ссылка на объект/метод[$object, 'methodName'] или ['ClassName', 'staticMethod'].

Тип параметра, принимающего любой из этих вариантов, — callable. Вы можете вызвать значение напрямую ($callback()) или через call_user_func() / call_user_func_array(), когда нужно передать динамический список аргументов.

Зачем использовать callback-функции в PHP?

Callbacks позволяют написать функцию один раз и настраивать её поведение при каждом вызове, не переписывая её:

  • Повторное использование кода. Обобщённая функция (например, «пройтись по списку и сделать что-то с каждым элементом») подходит для любой задачи, переданной в качестве callback.
  • Более чистая логика. Встроенные функции высшего порядка, такие как array_map и array_filter, заменяют ручные циклы одной декларативной строкой.
  • Разделение ответственности. Событийный код — обработчики форм, процессоры CLI-команд, хуки фреймворков — регистрирует callback, который срабатывает только при наступлении события, разделяя триггер и обработчик.

Как использовать callback-функции в PHP

Использовать callback-функции в PHP просто. Вы передаёте имя функции или анонимную функцию в качестве аргумента родительской функции. Вот пример использования именованной функции в качестве callback:

Пример PHP: использование именованной функции в качестве callback

php— editable, runs on the server

В приведённом примере myCallbackFunction передаётся как аргумент в parentFunction. При выполнении parentFunction она вызывает call_user_func и передаёт myCallbackFunction как аргумент. В результате myCallbackFunction выполняется и выводит сообщение "The callback function has been executed."

Вот пример использования анонимной функции в качестве callback:

Пример PHP: использование анонимной функции в качестве callback

php— editable, runs on the server

В этом примере анонимная функция присваивается переменной $myCallbackFunction. Затем эта переменная может быть передана как аргумент в parentFunction — точно так же, как именованная функция в предыдущем примере.

Начиная с PHP 7.4, для простых callbacks также можно использовать лаконичный синтаксис стрелочных функций (fn). Стрелочные функции автоматически захватывают переменные из родительской области видимости и обеспечивают более чистый синтаксис для коротких callbacks:

$myCallback = fn() => print("The arrow callback function has been executed.");
parentFunction($myCallback);

Передача аргументов в callback

Большинство полезных callbacks получают данные. Родительская функция определяет, какие аргументы передавать при вызове callback. Используйте call_user_func() для позиционной передачи аргументов или call_user_func_array() для передачи массива аргументов:

<?php

function applyToPair(callable $callback, int $a, int $b) {
  return call_user_func($callback, $a, $b);
}

$add      = fn(int $x, int $y) => $x + $y;
$multiply = fn(int $x, int $y) => $x * $y;

echo applyToPair($add, 4, 6);      // 10
echo "\n";
echo applyToPair($multiply, 4, 6); // 24

Здесь applyToPair не знает, выполняется ли сложение или умножение — это решение находится в передаваемом callback.

Использование callbacks со встроенными функциями

Чаще всего callbacks используются с функциями для работы с массивами в PHP. Они принимают callback и применяют его к каждому элементу списка, заменяя написанные вручную циклы.

<?php

$numbers = [1, 2, 3, 4, 5];

// array_map: transform every element
$squares = array_map(fn($n) => $n * $n, $numbers);
echo implode(', ', $squares);   // 1, 4, 9, 16, 25
echo "\n";

// array_filter: keep elements where the callback returns true
$evens = array_filter($numbers, fn($n) => $n % 2 === 0);
echo implode(', ', $evens);     // 2, 4
echo "\n";

// usort: sort using a comparison callback (descending order)
$values = [3, 1, 4, 1, 5];
usort($values, fn($a, $b) => $b <=> $a);
echo implode(', ', $values);    // 5, 4, 3, 1, 1

Подробнее о сортировке читайте в разделе Сортировка массивов в PHP.

Использование методов объектов в качестве callbacks

Callback также может указывать на метод. Передайте [$object, 'methodName'] для метода экземпляра или ['ClassName', 'staticMethod'] для статического:

<?php

class Greeter {
  public function greet(string $name): string {
    return "Hello, {$name}!";
  }

  public static function shout(string $name): string {
    return strtoupper("Hi {$name}");
  }
}

$greeter = new Greeter();

// Instance method as a callback
echo call_user_func([$greeter, 'greet'], 'Ada');   // Hello, Ada!
echo "\n";

// Static method as a callback
echo call_user_func(['Greeter', 'shout'], 'Ada');  // HI ADA

Совет: Начиная с PHP 8.1, можно использовать синтаксис callable первого класса$greeter->greet(...) или strtoupper(...) — чтобы получить Closure из любого callable без использования строк, что безопаснее и удобнее для IDE.

Заключение

Callback-функции в PHP — это мощный инструмент программирования. Они обеспечивают повторное использование кода, упрощают сложную логику и позволяют реализовывать событийное программирование на стороне сервера. Понимание callback-функций в PHP поможет вам вывести свои навыки PHP на новый уровень.

Практика

Практика
Что такое callback-функции в PHP?
Что такое callback-функции в PHP?
Was this page helpful?