Array_pop, array_shift等重载属性


array_pop, array_shift etc. on overloaded properties

我是在墨守成规,我不知道为什么我选择这个解决方案。这与为MongoDB构建一个简单的ORM有关,它比我想象的要复杂得多。但这不是重点。

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

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

<>之前//动态推送$model->comments += array('comment' => 'Oh hi there amigo ');//或者,push:array_push($model->comments, array('comment' => 'Oh hi there amigo.'));//Plus, pop, shift, unshift等array_{动词}(模型->注释);之前

基本上,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)合并,以给出最新的数据类型。

它通过使用表示法将原始和更改的数据扁平化为单个维度数组点并合并两者来实现这一点。蒙哥太松了,太疼了。(仅供参考:您可以使用original()changed()分别获得$_data$_changed)。

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

您可能需要升级PHP。在后来的版本中修复了这个问题(不确定是哪个版本)。在5.2.9为我工作。

如果您使用的是较新的版本,它仍然发出通知,您将需要确保使用签名定义__get:

public function &__get($val)

得到相同的问题与Kohana和Mongo_Document类和php 5.3.6,原来它想使用自己的方法来添加值,所以

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