PHP可调用对象作为对象成员

时间:2009-11-01 02:00:14

标签: php invoke callable

我有一个班级Logger,其中有一个方法Log 由于Log是[{1}}个实例的最常见用法,我已将Logger__invoke联系起来

另一个类“Site”包含一个成员“Log”,一个Logger实例。

为什么会这样:

Log

但不是这样:

$Log = $this->Log;  
$Log("Message");  

前者因“PHP致命错误:调用未定义的方法Site :: Log()”而失败 这是可调用对象实现的限制,还是我误解了什么?

3 个答案:

答案 0 :(得分:7)

不幸的是,这仍然是(PHP)的限制,但是当你考虑它时它是有意义的,因为类可以包含共享名称的属性和方法。例如:

<?php
class Test {
    public $log;

    public function __construct() {
        $this->log = function() {
            echo 'In Test::log property';
        };
    }

    public function log() {
        echo 'In Test::log() method';
    }
}

$test = new Test;
$test->log(); // In Test::log() method
call_user_func($test->log); // In Test::log property
?>

如果PHP允许你想要的语法,那么会调用哪个函数?不幸的是,只留下call_user_func[_array]()(或将$this->log复制到另一个变量并调用它)。

但是,如果可以接受以下语法,那就太好了:

<?php
{$test->log}();
?>

但唉,事实并非如此。

答案 1 :(得分:1)

这可能有效:

${this->Log}("Message");

<击>

但也许使用完整的通话更简单,更好?似乎没有办法让你想要在一条线上工作。

您的问题中的错误表明它正在寻找在该类上定义的不存在的函数。一个可调用的对象不是一个函数,在这种情况下它似乎不能被视为一个。

答案 2 :(得分:1)

你不能这样做的原因相同:

$value = $this->getArray()["key"];

甚至是

$value = getArray()["key"];

因为PHP语法不能很好地做到。