在 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 中将实例方法作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章