【发布时间】:2011-08-31 23:37:22
【问题描述】:
我陷入了困境,我不确定我为什么选择这个解决方案。与为 MongoDB 构建一个简单的 ORM 有关,它比我想象的要复杂得多。但这不是重点。
无论如何,我已经将所有文档数据存储在一个protected $_data 变量中,__get、__set 等魔术方法都映射到这个数组。
我所追求的是使用以下代码修改重载变量:
// 使用动态推送 $model->cmets += array('comment' => '哦,你好,朋友。'); // 或者,推送: array_push($model->cmets, array('comment' => '哦,你好,朋友。')); // Plus, pop, shift, unshift 等 数组_{动词}($model->cmets);基本上,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)。
这意味着它不像通过引用返回数组的一部分那么简单。但是,如果这是唯一的方法,那么它似乎必须重构?
【问题讨论】:
-
模型暂时会有pop、shift等方法。感觉不是很好,你不能添加数组假装它们是数字。耻辱。
-
您使用的是哪个版本的 PHP?
标签: php overloading