通过一个实例方法,如PHP参数(Passing an instance method as argu

2019-07-04 02:06发布

我想创建一个监听器类

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);

但是这个代码失败,此错误:

注意:未定义的属性:在index.php中富:: $栏上线18

捕获的致命错误:传递给监听器参数1 ::添加()必须调用,空给出,称为在线路18上的index.php和第5行中定义的index.php

我究竟做错了什么?

Answer 1:

  • PHP 5.4之前,有没有类型命名的callable ,所以如果你把它当作一种暗示,它的意思是“名称的类callable ”。 如果你使用PHP> = 5.4, callable是一个有效的提示。

  • 可调用通过描述可调用的名称(一个函数名或例如一个类方法名)或阵列,其中所述第一元件是一个对象和所述第二元件的一个实例的字符串指定的是方法的名称是调用。

对于PHP <5.4,替换

public function add(callable $function)

有:

public function add($function)

与调用它:

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


Answer 2:

方法和属性在PHP中有着不同的命名空间,这就是为什么$this->bar计算为null :你访问一个未定义的属性

的正确方法的形式创建一个数组array($object, "methodName")

正确地传递回调

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

你给的类型提示 是好的 PHP 5.4的-as,那是。



Answer 3:

我不认为你可以指定一个可调用的这种方式...

尝试

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

而看到http://php.net/manual/en/language.types.callable.php了。



文章来源: Passing an instance method as argument in PHP