Я знаю, что этот вопрос задавали несколько раз, но ни один из них не имеет реального ответа для обходного пути. Может быть, есть один для моего конкретного случая.
Я создаю класс mapper, который использует магический метод __get()
для ленивой загрузки других объектов. Это выглядит примерно так:
public function __get ( $index )
{
if ( isset ($this->vars[$index]) )
{
return $this->vars[$index];
}
// $index = 'role';
$obj = $this->createNewObject ( $index );
return $obj;
}
В моем коде я:
$user = createObject('user');
$user->role->rolename;
Это работает до сих пор. Объект User
не имеет свойства, называемого "роль", поэтому он использует магический метод __get()
для создания этого объекта и возвращает его свойство из объекта "role".
Но когда я пытаюсь изменить "rolename":
$user = createUser();
$user->role->rolename = 'Test';
Тогда это дает мне следующую ошибку:
Примечание: косвенная модификация перегруженного свойства не имеет эффекта
Не уверен, что это все еще некоторая ошибка в PHP или если это "ожидаемое поведение", но в любом случае это не работает так, как я хочу. Это действительно шоу-стоппер для меня... Потому что, насколько я могу изменить свойства ленивых загруженных объектов?
EDIT:
Фактическая проблема возникает только при возврате массива, который содержит несколько объектов.
Я добавил пример кода, который воспроизводит проблему:
Вы действительно должны запускать это в своей среде PHP, действительно видите "ошибку". Но здесь есть что-то действительно интересное.
Я пытаюсь изменить свойство объекта, которое дает мне уведомление "can not change overloaded property". Но если я повторю свойство после этого, я вижу, что он действительно DID меняет значение... Действительно странно...