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()"
这是可调用对象实现的限制,还是我误解了什么?
不幸的是,这仍然是(仍然)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)
但唉,事实并非如此.
您不能这样做的原因相同:
$value = $this->getArray()["key"];
甚至这个
$value = getArray()["key"];
因为 PHP 语法不太擅长速记。