PHP:如何使用类函数作为callback

我有一个类,我想用作callback方法。 如何将它们作为parameter passing?

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是不可用的)

查看callable手册 ,查看以callback方式传递函数的所有不同方法。 我在这里复制了这个手册,并根据你的场景添加了一些每种方法的例子。

可赎回


  • 一个PHP函数的名字作为一个string传递。 除了像array()echoempty()eval()exit()isset()list()printunset()这样的语言结构之外,还可以使用任何内置或用户定义的函数。 。
  // Not applicable in your scenario $this->processSomething('some_global_php_function'); 

  • 实例化对象的方法以包含索引为0的对象和索引为1的方法名称的数组的forms传递。
  // 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+ 

  • 除了常见的用户定义函数之外, 匿名函数也可以传递给一个callback参数。
  // Not applicable in your scenario unless you modify the structure $this->processSomething(function() { // process something directly here... }); 

从5.3开始,你可以写出更优雅的方式,但我仍然试图找出是否可以减less更多

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

你也可以使用call_user_func()指定一个callback:

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