最近我遇到了以下问题。这是一个发生问题的简单示例。
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在这里没有按预期工作。谁能解释一下这个?提前谢谢!
答案 0 :(得分:2)
我的猜测是,因为PHP中的函数和对象仍然没有得到相同的处理(尽管最近的PHP版本试图解决这个问题)。我怀疑存在语言限制,不允许obj
中的$this->obj()
被视为对象(因为该语法通常会引用方法),因此它只检查方法被班级暴露。
我没有测试过,但这可能有用:
$obj = $this->obj;
return $obj('c');
当然,理想情况下,$this->obj
应该可以作为对象访问,无论它是类的字段还是类定义的方法。通过这种方式,语法中存在歧义并不重要,因为首先不需要区分,但PHP不能像这样工作!