Twitt
@Twitt

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

Как я понимаю, коллбэк функция - это функция, которую можно вызвать как переменную, например
$variable = “myGreatFunc”;
$variable();
function myGreatFunc()
{
}

На сколько такое практично? Зачем оно надо, и когда это надо использовать?
  • Вопрос задан
  • 611 просмотров
Решения вопроса 2
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
Крайне хорошее описание по таким вещам есть в Википедии. А теперь к примерам:

1. Передача параметром
Такие функции удобно передавать параметром/возвращать из других функций. Тут лучше углубиться в тему: Функция высшего порядка

Например для удобной передачи асбтрактной функциональности, которая будет применяться например к каждому члену итератора/массива. Это используется например в таких стандартных функциях array_{map/filter/reduce}. В коллбеке то, что будет применяться к каждому члену массива.

Вообще функции высшего порядка не просто "пример использовани", а даже целая концепция программирования.

2. Отложенный/ленивый вызов
Например в PHP приложениях используется в роутерах/контейнере/логере, да много где. Суть в том, что в соллбеке спрятана функциональность, иногда очень большая. Элементов и этих фукцниональности тоже может быть много, а нужно все зарегистрировать. Чтобы не плодить тысячи объектов при регистрации — каждый кусочек функциональности заворачивают в коллбек, и только при вызове (например роута), вызывается коллбек и соответственно все, что в нем начинает работать.

class Container
{
     private $callableServices;

     public function add(string $serviceName, callable $service)
     {
          $this->callableServices[$serviceName] = $service;
     }

     public function get(string $serviceName)
     {
          $service = $this->callableServices[$serviceName];

          return $service();
     }
}

$container = new Container();
// объект тут не создается, тк он внутри функции, которая не вызывается
$container->add('a', function() {
     return new FirstBigService();
});
// объект тут не создается, тк он внутри функции, которая не вызывается
$container->add('b', function() {
     return new SecondBigService();
});

// Внутри метода get() идет не просто доставание нужного элемента, 
// а еще и его вызов (тк лежат функции), то есть именно сейчас 
// произойдет new FirstBigService()
$service = $container->get('a');


3. Изоляция контекста
// тут левый код
...

// Код ниже работает изолировано и на него ничего не может подействоват,
// т.к. внутри свой контекст
(function() {
    $app = new Application();
    $app->run();
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы