5

我有一个类Logger,其中有一个方法Log
作为LogLogger实例最常见的用途,我已连线__invoke调用Log

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

为什么会这样:

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

但不是这个:

$this->Log("Message");

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

4

4 回答 4

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}();
?>

但很可惜,事实并非如此。

于 2012-05-25T00:19:30.843 回答
1

这可能有效:

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

但也许使用完整的调用更容易更好?似乎没有一种方法可以在一条线上获得您想要的工作。

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

于 2009-11-01T02:08:38.730 回答
1

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

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

甚至这个

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

因为 PHP 语法不能很好地速记。

于 2009-11-01T02:19:20.020 回答
0

从 php7.4 开始,以下代码适用于我

($this->Log)("Message");
于 2021-08-30T13:31:38.273 回答