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


этот вопрос уже есть ответ здесь:

  • Как динамически вызвать метод класса в PHP? 8 ответов

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

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 не доступно)

3 51

3 ответа:

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

вызвать


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

  • A метод экземпляра объекта передается как массив, содержащий объект по индексу 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']);

  • статические методы класса также можно передать без создания экземпляра объекта этого класса, передав имя класса вместо объекта в index 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+

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

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

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

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

public function myMethod() {

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

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