Возвращает null по ссылке через get()


Быстрые спецификации:

PHP 5.3
error_reporting(-1) // the highest

Я использую трюк __get() по ссылке для магического доступа к произвольно глубоким элементам массива в объекте.

Быстрый пример:

public function &__get($key){
    return isset($this->_data[$key])
        ? $this->_data[$key]
        : null;
}

Это не работает, так как когда $key не установлен, он пытается вернуть null по ссылке, которая, конечно, бросает Only variable references should be returned by reference ... я попытался изменить его следующим образом:

public function &__get($key){
    $null = null;
    return isset($this->_data[$key])
        ? $this->_data[$key]
        : $null;
}

Все еще не работает, хотя я предполагаю, что установка $null на null по существу unset()это.

Что я могу сделать? Спасибо!


Просто решил, что я буду продвигать этот вопрос, так как он несколько релевантен (PHP magic and references); __callStatic (), call_user_func_array (), references и PHP 5.3.1 . Я еще не нашел ответа ...помимо модификации ядра PHP.

3 5

3 ответа:

Это не имеет ничего общего с null, а скорее с тернарным оператором:

Переписывая его с if/else не будет бросать уведомление:

public function &__get($key)
{
    $null = null;
    if (isset($this->_data[$key])) {
        return $this->_data[$key];
    } else {
        return $null;
    }
}
Тернарные операторы не могут приводить к ссылкам. Они могут возвращать только значения .

Зачем возвращать null явно? Если $key не существует в $this->_data ,он все равно вернется NULL?

Я рекомендую использовать следующее и настроить свою логику на другом конце. Вы, вероятно, уже проверяете для null сейчас. Вы можете изменить его на empty() или какой-то другой вариант. Или используйте исключения, как предлагаетМатье .

public function &__get($key){
    return $this->_data[$key];
}

У меня была эта проблема, но я понял, что я не должен возвращать null, когда ключ не был найден, но бросать исключение (потому что я обращался к неизвестному атрибуту в конце концов).

Но, может быть, это не то, что вы хотите сделать, я просто хотел поделиться этим.