Обратные вызовы могут быть обозначены объявлением вызываемого типа.

Некоторые функции, такие как call_user_func() или usort(), принимают в качестве параметра определяемые пользователем функции обратного вызова. Функции обратного вызова могут быть не только простыми функциями, но и объектными методами, включая статические методы класса.

Прохождение

Функция PHP передается по имени в виде строки . Можно использовать любую встроенную или определяемую пользователем функцию, кроме языковых конструкций, таких как: array() , echo , empty() , eval() , exit() , isset() , list() , print или unset(). .

Метод созданного объекта передается в виде массива , содержащего объект с индексом 0 и имя метода с индексом 1. Разрешен доступ к защищенным и закрытым методам из класса.

Методы статического класса также можно передавать без создания экземпляра объекта этого класса либо путем передачи имени класса вместо объекта с индексом 0, либо путем передачи 'ClassName::methodName'.

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

Примечание :

Начиная с PHP 8.1.0, анонимные функции также могут быть созданы с использованием синтаксиса callable первого класса .

Как правило, любой объект, реализующий __invoke() , также может быть передан в параметр обратного вызова.

 

Пример #1 Примеры функции обратного вызова

<?php

// An example callback function
function my_callback_function() {
    echo 'hello world!';
}

// An example callback method
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

// Type 1: Simple callback
call_user_func('my_callback_function');

// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Type 4: Static class method call
call_user_func('MyClass::myCallbackMethod');

// Type 5: Relative static class method call
class A {
    public static function who() {
        echo "A\n";
    }
}

class B extends A {
    public static function who() {
        echo "B\n";
    }
}

call_user_func(array('B', 'parent::who')); // A

// Type 6: Objects implementing __invoke can be used as callables
class C {
    public function __invoke($name) {
        echo 'Hello ', $name, "\n";
    }
}

$c = new C();
call_user_func($c, 'PHP!');
?>

 

Пример #2 Пример обратного вызова с использованием замыкания

<?php
// Our closure
$double = function($a) {
    return $a * 2;
};

// This is our range of numbers
$numbers = range(1, 5);

// Use the closure as a callback here to
// double the size of each element in our
// range
$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);
?>

Приведенный выше пример выведет:

2 4 6 8 10

Примечание :

Обратные вызовы , зарегистрированные с помощью таких функций, как call_user_func() и call_user_func_array() , не будут вызываться, если в предыдущем обратном вызове возникло неперехваченное исключение.