Неоднозначное утверждение PHP при установке значения свойства динамического класса - PullRequest
1 голос
/ 01 августа 2011

У меня есть класс с именем PreferenceCollection, который я загружаю для пользователя в $_SESSION['Preferences'] после входа в мое веб-приложение. Этот простой класс использует магические методы для получения и установки значений. Вот соответствующие части:

class PreferenceCollection {
    private $prefs;

    function __construct() {
        $this->prefs=Array();
    }

    function __get($var) {
        return $this->prefs[$var];
    }

    function __set($var, $value) {
        $this->prefs[$var]=$value;
        $this->save();
    }
}

Позже в моем коде я обнаружил, что необходимо установить значение динамически выбранного свойства. Для этого примера $key='pref_some_preference' и value='something'.

$_SESSION['Preferences']->substr($key, 5)=$value;

То, что я ожидаю, эквивалентно $_SESSION['Preferences']->some_preference=$value. Таким образом, магический метод __set будет вызываться с первым параметром some_preference, а со вторым параметром $value.

Вместо этого эта строка дает мне фатальную ошибку:

Неустранимая ошибка PHP: невозможно использовать возвращаемое значение метода в контексте записи

Я предполагаю, что PHP интерпретирует, что я хочу установить возвращаемое значение вызова substr() для чего-то, а не устанавливать свойство.

Правильно ли мое толкование происходящего? Как бы я обойти эту проблему?

На данный момент я работаю над этой проблемой с помощью открытого метода set, но мне любопытно, как я могу установить это свойство напрямую.

1 Ответ

3 голосов
/ 01 августа 2011

Я думаю, что вы хотите

$_SESSION['Preferences']->{substr($key, 5)} = $value;

Скобки {} необходимы для направления синтаксического анализатора PHP в правильном направлении ;-) Учитывая, что $key равно 12345test, это вызовет __set('test', $value).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...