我有一个类,我想用作回调的方法。如何将它们作为参数传递?
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
无法使用时)执行相同操作
答案 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...
}