Передача зворотніх викликів
Як аргумент, функція 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);
?>
Поданий вище приклад
виведе:
Зауваження:
В PHP 4, необхідно було використовувати посилання для створення callback,
який вказує на актуальний об'єкт, а не на його копію. Для уточнень,
прогляньте
Пояснення Посилань.
Зауваження:
Зворотні виклики,
зареєстровані через функції call_user_func() і
call_user_func_array(), не будуть викликатись при наявності
неспійманих винятків, викинутих в попередніх зворотніх викликах.