PHP - Косвенная модификация перегруженного свойства

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

Я создаю класс преобразователя, который использует магический метод __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 или если это «ожидаемое поведение», но в любом случае это не работает так, как я хочу. Это действительно шоу-стоп для меня...Потому что как я могу изменить свойства лениво загруженных объектов??


РЕДАКТИРОВАТЬ:

Настоящая проблема возникает только тогда, когда я возвращаю массив, содержащий несколько объектов.

Я добавил пример кода, который воспроизводит проблему:

http://codepad.org/T1iPZm9t

Вы действительно должны запустить это в своей среде PHP, чтобы действительно увидеть "ошибку". Но здесь происходит что-то действительно интересное.

Я пытаюсь изменить свойство объекта, что дает мне уведомление «невозможно изменить перегруженное свойство». Но если я повторю свойство после этого, я увижу, что оно действительно изменило значение... Действительно странно...

53
задан Andrew 21 June 2017 в 06:09
поделиться