有关重载属性的array_pop,array_shift等

时间:2011-08-31 23:37:23

标签: php overloading

我陷入了困境,我不确定为什么选择这个解决方案。与为MongoDB构建一个简单的ORM有关,它比我想象的要复杂得多。但这不是重点。

无论如何,我已将所有文档数据存储在protected $_data变量中,并且魔术方法__get__set等都映射到此数组。

我想要的是使用以下代码修改重载变量:

// Dynamically push using
$model->comments += array('comment' => 'Oh hi there amigo.');

// Alternatively, to push:
array_push($model->comments, array('comment' => 'Oh hi there amigo.'));

// Plus, pop, shift, unshift etc.
array_{verb}($model->comments);

基本上,PHP很痛苦并且发出通知说:

 Indirect modification of overloaded property Model_Blogpost::$comments has no effect

我不喜欢这一点。如果这个逻辑可以放在__set和__get中,那么就不需要为mongo采用的每个数据类型创建单独的类。至少,这就是我现在所说的逻辑。

有人知道这样的事情是否可行?或者我们是否需要做自己的本土功能来排序这类东西(作为最后的手段)?

提前致谢,感谢你的朋友。

编辑:

PHP版本是5.3.6并且在&__get中通过引用返回有点棘手 - 这里是代码的快速概述:

https://github.com/dynamism/Mundo/blob/develop/classes/mundo/object/core.php

基本上,__get调用get()来减少代码重复。 get()将加载的模型数据($_data)与已更改但未保存的模型数据($_changed)合并,以提供最新的数据类型。

它通过使用符号将原始数据和已更改数据展平为单维数组点并将两者合并来实现此目的。 Mongo是如此松散,这是一种痛苦。 (仅供参考:您可以使用original()changed()分别仅获取$_data$_changed

这意味着它不像通过引用返回数组的一部分那么简单。如果这是唯一的方法,那么看起来它必须被重构?

2 个答案:

答案 0 :(得分:2)

您可能需要升级PHP。这在以后的版本中修复(不确定是哪个)。适用于5.2.9。

如果您使用的是更高版本且仍然会发出通知,则需要确保使用签名定义__get

public function &__get($val)

答案 1 :(得分:0)

与Kohana和Mongo_Document类以及php 5.3.6有同样的问题,原来它想要使用自己的方法来添加值,所以

$model->push('comments',array('comment' => 'Oh hi there amigo.'));

是一种方法