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(), не будуть викликані, якщо у попередньому виклику виникла неперехоплена виняткова ситуація.