Я знаю, что этот вопрос задавался несколько раз, но ни один из них не дал реального ответа на обходной путь. Может быть, есть один для моего конкретного случая.
Я создаю класс преобразователя, который использует магический метод __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()
для создания этого объекта и возвращает его свойство из объекта «роль». .
Но когда я пытаюсь изменить «имя роли»:
$user = createUser();
$user->role->rolename = 'Test';
Затем выдает следующую ошибку:
Примечание: Косвенное изменение перегруженного свойства не имеет никакого эффекта
Не уверен, что это все еще какая-то ошибка в PHP или если это «ожидаемое поведение», но в любом случае это не работает так, как я хочу. Это действительно шоу-стоп для меня...Потому что как я могу изменить свойства лениво загруженных объектов??
РЕДАКТИРОВАТЬ:
Настоящая проблема возникает только тогда, когда я возвращаю массив, содержащий несколько объектов.
Я добавил пример кода, который воспроизводит проблему:
Вы действительно должны запустить это в своей среде PHP, чтобы действительно увидеть "ошибку". Но здесь происходит что-то действительно интересное.
Я пытаюсь изменить свойство объекта, что дает мне уведомление «невозможно изменить перегруженное свойство». Но если я повторю свойство после этого, я увижу, что оно действительно изменило значение... Действительно странно...