Подтвердить что ты не робот

PHP: как использовать функцию класса в качестве обратного вызова

У меня есть класс с методами, которые я хочу использовать в качестве обратных вызовов. Как передать их в качестве аргументов?

Class MyClass {

    public function myMethod() {
        $this->processSomething(this->myCallback); // How it must be called ?
        $this->processSomething(self::myStaticCallback); // How it must be called ?
    }

    private function processSomething(callable $callback) {
        // process something...
        $callback();
    }

    private function myCallback() {
        // do something...
    }

    private static function myStaticCallback() {
        // do something...
    }   

}

UPD: Как сделать то же самое, но из метода static (когда $this недоступно)

4b9b3361

Ответ 1

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

Callable


  • Функция PHP передается по имени в виде строки. Любая встроенная или определяемая пользователем функция может использоваться, за исключением языковых конструкций, таких как: array(), echo, empty(), eval(), exit(), isset(), list(), print или unset().
  // Not applicable in your scenario
  $this->processSomething('some_global_php_function');

  • Метод объекта передается как массив, содержащий объект с индексом 0 и имя метода в индексе 1.
  // Only from inside the same class
  $this->processSomething([$this, 'myCallback']);
  $this->processSomething([$this, 'myStaticCallback']);
  // From either inside or outside the same class
  $myObject->processSomething([new MyClass(), 'myCallback']);
  $myObject->processSomething([new MyClass(), 'myStaticCallback']);

  • Статические методы класса также могут передаваться без создания экземпляра объекта этого класса путем передачи имени класса вместо объекта с индексом 0.
  // Only from inside the same class
  $this->processSomething([__CLASS__, 'myStaticCallback']);
  // From either inside or outside the same class
  $myObject->processSomething(['\Namespace\MyClass', 'myStaticCallback']);
  $myObject->processSomething(['\Namespace\MyClass::myStaticCallback']); // PHP 5.2.3+
  $myObject->processSomething([MyClass::class, 'myStaticCallback']); // PHP 5.5.0+

  • Помимо общей пользовательской функции, анонимные функции также могут быть переданы параметру обратного вызова.
  // Not applicable in your scenario unless you modify the structure
  $this->processSomething(function() {
      // process something directly here...
  });

Ответ 2

Вы также можете использовать call_user_func() для указания обратного вызова:

public function myMethod() {

    call_user_func(array($this, 'myCallback'));
}

private function myCallback() {
    // do something...
}

Ответ 3

Начиная с версии 5.3 есть более элегантный способ, которым вы можете написать это, я все еще пытаюсь выяснить, можно ли уменьшить его

$this->processSomething(function() {
    $this->myCallback();
});