我知道这个问题已经被问过好几次了,但是他们都没有一个真正的解决方案。也许有一个专门针对我的案子。
我正在构建一个 mapper 类,它使用神奇的方法 __get()
来延迟加载其他对象。它看起来像这样:
public function __get ( $index )
{
if ( isset ($this->vars[$index]) )
{
return $this->vars[$index];
}
// $index = 'role';
$obj = $this->createNewObject ( $index );
return $obj;
}
在我的代码中,我这样做:
$user = createObject('user');
$user->role->rolename;
到目前为止还行。User
对象没有名为“ role”的属性,因此它使用神奇的 __get()
方法创建该对象,并从“ role”对象返回其属性。
但是当我试图修改“ roename”的时候:
$user = createUser();
$user->role->rolename = 'Test';
然后它给了我下面的错误:
注意: 间接修改重载属性无效
不确定这是否仍然是 PHP 中的一些 bug 或者它是否是“预期行为”,但无论如何它都不能按照我想要的方式工作。这对我来说真是一个精彩的表演... ... 因为我究竟如何才能改变这些延迟加载对象的属性呢? ?
编辑:
实际问题似乎只有在返回包含多个对象的数组时才会出现。
我已经添加了一段示例代码来重现这个问题:
你真的应该在你的 PHP 环境中运行这个,真的看到’错误’。但是这里发生了一些非常有趣的事情。
我尝试改变一个对象的属性,这会给我一个“不能改变重载属性”的通知。但是如果我重复这个属性之后,我看到它确实改变了值... 真的很奇怪..。