我有一个班级Logger
,其中有一个方法Log
由于Log
是[{1}}个实例的最常见用法,我已将Logger
与__invoke
联系起来
另一个类“Site”包含一个成员“Log”,一个Logger实例。
为什么会这样:
Log
但不是这样:
$Log = $this->Log;
$Log("Message");
前者因“PHP致命错误:调用未定义的方法Site :: Log()”而失败 这是可调用对象实现的限制,还是我误解了什么?
答案 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语法不能很好地做到。