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

Solutions Collecting From Web of "PHP: как использовать функцию класса как обратный вызов"

Проверьте руководство по 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... }); 

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

 public function myMethod() { call_user_func(array($this, 'myCallback')); } private function myCallback() { // do something... } 

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

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