__invoke行为在对象引用上丢失

时间:2013-05-28 12:54:48

标签: php oop invoke

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

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在这里没有按预期工作。谁能解释一下这个?提前谢谢!

1 个答案:

答案 0 :(得分:2)

我的猜测是,因为PHP中的函数和对象仍然没有得到相同的处理(尽管最近的PHP版本试图解决这个问题)。我怀疑存在语言限制,不允许obj中的$this->obj()被视为对象(因为该语法通常会引用方法),因此它只检查方法被班级暴露。

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

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

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