我有一个类,我想用作回调的方法.如何将它们作为参数传递?
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...
}
}
Run Code Online (Sandbox Code Playgroud)
UPD:如何从static
方法中做同样的事情(什么时候$this
不可用)
Mik*_*ikO 111
查看callable
手册以查看将函数作为回调传递的所有不同方法.我在这里复制了该手册,并根据您的场景添加了每种方法的一些示例.
可赎回
- 一个PHP函数是由它的名字作为字符串传递.可以使用任何内置或用户定义的函数,除了语言结构,例如:array(),echo,empty(),eval(),exit(),isset(),list(),print或unset().
// Not applicable in your scenario
$this->processSomething('some_global_php_function');
Run Code Online (Sandbox Code Playgroud)
- 甲一个实例化的对象的方法为含有索引对象的数组传递0和索引方法名1.
// 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']);
Run Code Online (Sandbox Code Playgroud)
- 通过传递类名而不是索引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+
Run Code Online (Sandbox Code Playgroud)
- 除了常见的用户定义函数,匿名函数也可以传递给回调参数.
// Not applicable in your scenario unless you modify the structure
$this->processSomething(function() {
// process something directly here...
});
Run Code Online (Sandbox Code Playgroud)
Dha*_*man 36
从 PHP 8.1 开始,我们现在拥有一流的 callables。他们使用语法$callable = functionName(...)
. 这三个点是语法的一部分,而不是遗漏。
您可以使用新语法创建可调用的类方法。
Class MyClass {
public function myMethod() {
// first-class callables
$this->processSomething($this->myCallback(...));
$this->processSomething(self::myStaticCallback(...));
}
private function processSomething(callable $callback) {
// Process something...
$callback();
}
private function myCallback() {
// Do something...
}
private static function myStaticCallback() {
// Do something...
}
}
Run Code Online (Sandbox Code Playgroud)
这三个点不是参数的省略/占位符。它们是创建可调用对象的特殊语法。如果该方法不接受任何参数,则语法保持不变。
从5.3开始,你可以用更优雅的方式编写它,我仍然试图找出它是否可以减少更多
$this->processSomething(function() {
$this->myCallback();
});
Run Code Online (Sandbox Code Playgroud)
小智 6
您还可以使用call_user_func()指定回调:
public function myMethod() {
call_user_func(array($this, 'myCallback'));
}
private function myCallback() {
// do something...
}
Run Code Online (Sandbox Code Playgroud)