如何使用类方法作为回调


How to use class methods as callbacks

我有一个类,其中包含我想用作回调的方法.
如何将它们作为参数传递?

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手册,了解将函数作为回调传递的所有不同方法。我在此处复制了该手册,并根据您的方案添加了每种方法的一些示例。

调用


  • 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...
  });

从 PHP 8.1 开始,我们现在有了一流的可调用对象。他们使用语法$callable = functionName(...) .这三个点是语法的一部分,而不是遗漏。

可以使用新语法创建可调用的类方法。

Class MyClass {
    
    public function myMethod() {
        // first-class callables
        $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...
    }   
    
}

这三个点不是参数的省略/占位符。它们是用于创建可调用对象的特殊语法。如果该方法不接受任何参数,则语法保持不变。

由于 5.3 有一种更优雅的编写方式,我仍在尝试找出是否可以减少更多

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

你也可以使用 call_user_func() 来指定回调:

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

可以将方法返回类型设置为 callable 。它适用于 PHP 7.1

protected function myMethod(): callable
{
    return function (int $j) {
    };
}

然后这样称呼它:

someFunction($this->myMethod());