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... }