将对象函数作为回调传递
Pass object function as callback
有没有办法将“方法引用”传递给接受回调的函数?
例如:
function ex($callback){
$callback();
}
$obj = (object) ['f' => function(){echo "hello";}];
ex($obj->a)
显然这是一个非常简单的案例,图像有一个复杂的对象$obj
,里面有参数
PHP 不像 Javascript.
那样工作
此代码:
$obj = (object) ['f' => function(){echo "hello";}];
没有定义“具有方法 f()
的对象”,它定义了“具有 属性 f
且 碰巧 的对象是可调用类型。
调用 $obj->f();
直接导致:
Fatal error: Uncaught Error: Call to undefined method stdClass::f()
需要特殊处理如:
$func = $obj->f;
$func();
或:
($obj->f)();
虽然不是完全准确的陈述,但您可以认为可调用类型在实际被调用之前需要相当于“被解除引用”。
你的例子是一个“成功的错误”,因为它试图使用 PHP 没有的“第一个 class 函数”,但是在一个允许这样做的畸形对象上失败。
使用正确的 class:
function ex($callback){
$callback();
}
class Example {
public function f_instance() {
echo "instance call\n";
}
public static function f_static() {
echo "static call\n";
}
}
ex(['Example', 'f_static']);
$e = new Example();
ex([$e, 'f_instance']);
输出:
static call
instance call
参考:https://www.php.net/manual/en/language.types.callable.php
有没有办法将“方法引用”传递给接受回调的函数?
例如:
function ex($callback){
$callback();
}
$obj = (object) ['f' => function(){echo "hello";}];
ex($obj->a)
显然这是一个非常简单的案例,图像有一个复杂的对象$obj
,里面有参数
PHP 不像 Javascript.
那样工作此代码:
$obj = (object) ['f' => function(){echo "hello";}];
没有定义“具有方法 f()
的对象”,它定义了“具有 属性 f
且 碰巧 的对象是可调用类型。
调用 $obj->f();
直接导致:
Fatal error: Uncaught Error: Call to undefined method stdClass::f()
需要特殊处理如:
$func = $obj->f;
$func();
或:
($obj->f)();
虽然不是完全准确的陈述,但您可以认为可调用类型在实际被调用之前需要相当于“被解除引用”。
你的例子是一个“成功的错误”,因为它试图使用 PHP 没有的“第一个 class 函数”,但是在一个允许这样做的畸形对象上失败。
使用正确的 class:
function ex($callback){
$callback();
}
class Example {
public function f_instance() {
echo "instance call\n";
}
public static function f_static() {
echo "static call\n";
}
}
ex(['Example', 'f_static']);
$e = new Example();
ex([$e, 'f_instance']);
输出:
static call
instance call
参考:https://www.php.net/manual/en/language.types.callable.php