【问题标题】:Pass object function as callback将对象函数作为回调传递
【发布时间】:2021-10-26 20:35:19
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

  • 除非方法是静态的,否则你需要提供一个对象来调用它。
  • 如果你使用相同的属性名,那么是的,f 不是a 3v4l.org/XgQG6 或者我只是不明白这个问题。

标签: php callback


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多