1

最近我遇到了以下问题。这是一个发生问题的简单示例。

class a{
    public function __invoke($classname){
        return new $classname($this);
    }
}
class b{
    private $obj;
    public function __construct($obj){
        $this->obj = $obj;
    }
    public function getC(){
        return $this->obj('c');
    }
}
class c{}

$a = new a;
$a('b')->getC();

当我执行此代码时,出现以下错误

致命错误:调用未定义的方法 b::obj()

似乎 __invoke 的行为在这一行的对象引用上丢失了

return $this->obj('c');

它实际上对我来说不是什么大问题,因为我也可以这样做

return $this->obj->__invoke('c');

..但我真的很想知道为什么 __invoke 在这里不能按预期工作。谁能给我解释一下?提前致谢!

4

1 回答 1

2

我的猜测是,这是因为 PHP 中的函数和对象仍然没有得到同等对待(即使最新版本的 PHP 已经尝试解决这个问题)。我怀疑存在语言限制,不允许将objin$this->obj()视为对象(因为该语法通常会引用方法),因此它只检查类公开的方法。

我没有测试过,但这可能有效:

$obj = $this->obj;
return $obj('c');

当然,理想情况下,$this->obj无论是类的字段还是类定义的方法,都应该可以作为对象访问。这样一来,语法中的歧义并不重要,因为首先不需要区分,但是 PHP 不是这样工作的!

于 2013-05-28T12:59:52.543 回答