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() , echo , empty() , eval() , exit() , isset() , list() , print或unset()这样的语言结构之外,还可以使用任何内置或用户定义的函数。 。
  // 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... }