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

Posted

技术标签:

【中文标题】在 PHP 中将实例方法作为参数传递【英文标题】:Passing an instance method as argument in 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 没有构造方法有关吗? 【参考方案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 开始。

【讨论】:

以上是关于在 PHP 中将实例方法作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中将类型作为方法参数传递

在 COM 互操作方法中将字符串作为参数传递

我们可以在 PHP 中的任何函数中将数组作为参数传递吗?

在请求中将数字作为URL中的参数传递:PHP

在辅助方法中将 self 作为参数传递

在 Ruby 中将方法作为参数传递