array_pop, array_shift и т. д. на перегруженных свойствах - PullRequest
1 голос
/ 01 сентября 2011

Я в колее, и я не уверен, почему я выбрал это решение.Что-то связанное с созданием простого 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 соответственно).

Это означает, что это не так просто, как вернуть часть массива по ссылке.Если это единственный способ сделать это, похоже, его придется реорганизовать?

Ответы [ 2 ]

2 голосов
/ 01 сентября 2011

Возможно, вам потребуется обновить ваш PHP. Это было исправлено в более поздних версиях (не уверен, какой). У меня работает в 5.2.9.

Если вы используете более позднюю версию и она по-прежнему выдает уведомления, вам нужно убедиться, что вы определяете __get с подписью:

public function &__get($val)

0 голосов
/ 20 октября 2011

Получил ту же проблему с классами Kohana и Mongo_Document и php 5.3.6, оказалось, что он хочет использовать собственные методы для добавления значений, поэтому

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

- это путь для

...