首页 > 解决方案 > 将对象函数作为回调传递

问题描述

有没有办法将“方法引用”传递给接受回调的函数?

例如。:

function ex($callback){
   $callback();
}

$obj = (object) ['f' => function(){echo "hello";}];
ex($obj->a)

显然这是一个非常简单的例子,图像有一个复杂的对象$obj,里面有参数

标签: phpcallback

解决方案


PHP 不像 Javascript 那样工作。

这段代码:

$obj = (object) ['f' => function(){echo "hello";}];

没有定义“具有方法的对象f()”,它定义了“具有恰好是可调用类型的属性的f对象

直接调用$obj->f();会导致:

致命错误:未捕获的错误:调用未定义的方法 stdClass::f()

它需要特别处理,例如:

$func = $obj->f;
$func();

或者:

($obj->f)();

虽然这不是一个完全准确的陈述,但您可以认为可调用类型在实际调用之前需要相当于“被取消引用”。

你的例子是一个“成功的错误”,因为它试图使用 PHP 没有的“第一类函数”,但是在一个格式错误的对象上允许它不会失败。

使用适当的类:

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


推荐阅读