在 PHP 中将实例方法作为参数传递

2022-08-30 13:09:25

我想创建一个侦听器类

class Listener {
    var $listeners = array();
    
    public function add(callable $function) {
        $this->listeners[] = $function;
    }

    public function fire() {
        foreach($this->listeners as $function) {
            call_user_func($function);
        }
    }
}

class Foo {
    public function __construct($listener) {
        $listener->add($this->bar);
    }
    
    public function bar() {
        echo 'bar';
    }
}



$listener = new Listener();
$foo = new Foo($listener);

但此代码失败并显示以下错误:

注意:未定义的属性:Foo::索引中的$bar.php第 18 行

可捕获的致命错误:传递给 Listener::add() 的参数 1 必须是可调用的,给定 null,在索引中调用.php在第 18 行上,在第 5 行定义索引.php

我做错了什么?


答案 1
  • 在 PHP 5.4 之前,没有名为 的类型,因此,如果您将其用作类型提示,则表示“名为 ”的类。如果使用 PHP >= 5.4,则为有效提示。callablecallablecallable

  • 可调用由描述可调用名称(例如函数名称或类方法名称)或数组指定,其中第一个元素是对象的实例,第二个元素是要调用的方法的名称。

对于 PHP < 5.4,请将

public function add(callable $function)

跟:

public function add($function)

用以下方式称呼它:

$listener->add(array($this, 'bar'));

答案 2

方法和属性在 PHP 中具有单独的命名空间,这就是为什么计算结果为 :您正在访问未定义的属性$this->barnull

以以下形式创建数组的正确方法:array($object, "methodName")

正确传递回调

$listener->add(array($this, 'bar'));  

您给出的类型提示是可以的 - 从 PHP 5.4 开始,就是这样。


推荐