Я в колее, и я не уверен, почему я выбрал это решение.Что-то связанное с созданием простого ORM для MongoDB, который стал намного сложнее, чем я себе представлял.Но дело не в этом.
В любом случае, у меня есть все данные документа, хранящиеся в переменной 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
), чтобы получить самый последний тип данных.
Это делается путем сглаживания исходных и измененных данных вточка массива одного измерения с использованием нотации и объединение двух.Монго такой свободный, что это боль.(К вашему сведению: вы можете использовать original()
и changed()
, чтобы получить только $_data
или $_changed
соответственно).
Это означает, что это не так просто, как вернуть часть массива по ссылке.Если это единственный способ сделать это, похоже, его придется реорганизовать?