【问题标题】:Passing an instance method as argument in PHP在 PHP 中将实例方法作为参数传递
【发布时间】:2012-11-12 15:33:57
【问题描述】:

我想创建一个 Listener 类

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

但此代码失败并出现此错误:

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

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

我做错了什么?

【问题讨论】:

  • 我不是真正的 oop 专家,但这可能与 listener 没有构造方法有关吗?

标签: php class methods argument-passing


【解决方案1】:

我认为您不能以这种方式指定可调用对象...

试试

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

也可以查看http://php.net/manual/en/language.types.callable.php

【讨论】:

  • 您不需要参考。
  • ...因为对象总是被视为引用并且从不复制。
【解决方案2】:
  • 在 PHP 5.4 之前,没有名为 callable 的类型,因此如果将其用作类型提示,则表示“名为 callable 的类”。如果您使用 PHP >= 5.4,callable 是一个有效的提示。

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

对于 PHP

public function add(callable $function)

与:

public function add($function)

调用它:

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

【讨论】:

    【解决方案3】:

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

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

    正确传递回调

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

    你给is okay类型提示——从 PHP 5.4 开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2012-07-24
      • 2013-09-13
      • 2022-01-05
      • 1970-01-01
      • 2011-03-29
      相关资源
      最近更新 更多