如何使用类方法作为回调

2022-06-21 00:00:00 oop callback php

我有一个包含要用作回调的方法的类。
如何将它们作为参数传递?

Class MyClass {
    
    public function myMethod() {
        // How should these be called?
        $this->processSomething(this->myCallback);
        $this->processSomething(self::myStaticCallback);
    }

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

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

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

解决方案

查看callable manual以查看将函数作为回调传递的所有不同方式。我在这里复制了该手册,并根据您的方案添加了每种方法的一些示例。

可调用


  • PHP函数按其名称作为字符串传递。可以使用任何内置或用户定义的函数,但语言构造除外:数组()、回显、空()、val()、退出()、isset()、列表()、打印或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(['NamespaceMyClass', 'myStaticCallback']);
  $myObject->processSomething(['NamespaceMyClass::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...
  });

相关文章