将对象函数作为回调传递

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