PHP:如何使用类函数作为回调

时间:2015-03-10 00:25:43

标签: php oop callback

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

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 个答案:

答案 0 :(得分:99)

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

  

可赎回


  
      
  • PHP函数以其名称作为字符串传递。除了语言结构之外,可以使用任何内置或用户定义的函数,例如: array() echo empty() eval() exit() isset() list() print unset()
  •   
  // Not applicable in your scenario
  $this->processSomething('some_global_php_function');

  
      
  • 实例化对象的方法作为包含索引 0 的对象和索引 1 的方法名称的数组传递。< / LI>   
  // 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...
  });

答案 1 :(得分:8)

自5.3以来你可以用更优雅的方式来编写它,我还在试图找出它是否可以减少更多

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

答案 2 :(得分:6)

您还可以使用call_user_func()指定回调:

public function myMethod() {

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

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