Зворотні виклики (Callbacks / Callables)

Починаючи з PHP 5.4, зворотні виклики можуть позначатись через тип callable, що означає - придатний для виклика. В даній документації тип callback вживають з тією ж метою.

Деякі функції, наприклад, call_user_func() або usort() приймають визначені користувачем callback-функції в якості параметра. Callback-функції можуть бути не лише простими функціями, але також і методами об'єктів, включаючи статичні методи класів.

Передача зворотніх викликів

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

Метод, вже створеного об'єкта, передається в масиві, де сам об'єкт має індекс 0, а його метод - індекс 1.

Також в масиві можна передавати статичний метод класа, коли в індексі 0, замість об'єкта, йде назва класа. Починаючи з PHP 5.2.3, метод вже можна передавати в форматі 'ClassName::methodName'.

Окрім загальних функцій, визначених користувачем, anonymous functions (анонімні функції) також можуть передаватись в якості callback-параметрів.

Приклад #1 callback-функцій

<?php

// Приклад callback-функції
function my_callback_function() {
echo
'Привіт, Світ!';
}

// Приклад callback-метода
class MyClass {
static function
myCallbackMethod() {
echo
'Привіт, Світ!';
}
}

// Тип 1: Простий callback
call_user_func('my_callback_function');

// Тип 2: Виклик статичного метода класа
call_user_func(array('MyClass', 'myCallbackMethod'));

// Тип 3: Виклик метода об'єкта
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Тип 4: Виклик статичного метода класа (Починаючи з PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

// Тип 5: Виклик відносного статичного метода (Починаючи з PHP 5.3.0)
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
?>

Приклад #2 Передача анонімної функції в якості сallback-параметра

<?php
// Наша анонімна функція
$double = function($a) {
return
$a * 2;
};

// Це наш діапазон номерів
$numbers = range(1, 5);

// Використовуємо анонімну функцію як callback-параметр для
// перемноження на 2 кожного елемента в нашому діапазоні
$new_numbers = array_map($double, $numbers);

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

Поданий вище приклад виведе:

2 4 6 8 10

Зауваження: В PHP 4, необхідно було використовувати посилання для створення callback, який вказує на актуальний об'єкт, а не на його копію. Для уточнень, прогляньте Пояснення Посилань.

Зауваження:

Зворотні виклики, зареєстровані через функції call_user_func() і call_user_func_array(), не будуть викликатись при наявності неспійманих винятків, викинутих в попередніх зворотніх викликах.