Callbacks / Callables
Оновлено: 12.05.2023
Зворотні виклики можна позначити за допомогою оголошення типу callable.
Деякі функції, такі як call_user_func() або usort(), приймають визначені користувачем функції зворотного виклику як параметр. Функції зворотного виклику можуть бути не лише простими функціями, але й методами об'єктів, зокрема статичними методами класів.
Функція PHP передається за її ім'ям у вигляді рядка. Можна використовувати будь-яку вбудовану або визначену користувачем функцію, за винятком таких мовних конструкцій, як: array(), echo, empty(), eval(), exit(), isset(), list(), print або unset().
Метод екземплярного об'єкту передається у вигляді масиву, що містить об'єкт з індексом 0 та ім'я методу з індексом 1. Доступ до protected та private методів з класу дозволяється.
Статичні методи класу також можна передавати без створення об'єкта цього класу, або передаючи ім'я класу замість об'єкта з індексом 0, або передаючи 'ClassName::methodName'.
Окрім звичайних користувацьких функцій, до параметра зворотного виклику можна передавати анонімні функції та стрілочні функції.
Зауважте:
Починаючи з версії PHP 8.1.0, анонімні функції також можна створювати за допомогою синтаксису виклику першого класу.
Взагалі, будь-який об'єкт, що реалізує __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, deprecated as of PHP 8.2.0
// 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);
?>
Зауважте:
Зворотні виклики, зареєстровані за допомогою таких функцій, як call_user_func() і call_user_func_array(), не будуть викликані, якщо у попередньому виклику виникла неперехоплена виняткова ситуація.