Крайне хорошее описание по таким вещам есть
в Википедии. А теперь к примерам:
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();
});