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

Jam*_*ney 5 php callable invoke

我有一个课程Logger,其中包括一个方法Log.
作为实例Log的最常见用途Logger,我已__invoke拨打电话Log

另一个类"Site"包含一个成员"Log",一个Logger实例.

为什么这样做:

$Log = $this->Log;  
$Log("Message");  
Run Code Online (Sandbox Code Playgroud)

但不是这个:

$this->Log("Message");
Run Code Online (Sandbox Code Playgroud)

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

rin*_*aun 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
?>
Run Code Online (Sandbox Code Playgroud)

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

但是,如果可以接受以下语法,那将是很好的:

<?php
{$test->log}();
?>
Run Code Online (Sandbox Code Playgroud)

但唉,事实并非如此.


Ken*_*ins 1

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

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

甚至这个

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

因为 PHP 语法不太擅长速记。