Невозможно использовать возвращаемое значение метода в контексте записи

Я бы подумал, что следующий фрагмент кода должен работать, но он не (Отредактировано: теперь работает в PHP 5.5 +):

if (!empty($r->getError()))

Где getError() просто:

public function getError()
{
    return $this->error;
}

И все же я получаю эту ошибку:

не может использовать возвращаемое значение метода в контексте записи

Что это значит? Разве это не просто чтение?

Ответ 1

empty() должен получить доступ к значению по ссылке (чтобы проверить, указывает ли эта ссылка на то, что существует), а PHP до 5.5 не поддерживал ссылки на временные значения, возвращаемые функциями.

Однако реальная проблема заключается в том, что вы используете empty() вообще, ошибочно полагая, что "пустое" значение отличается от "false".

Пусто - это просто псевдоним для !isset($thing) || !$thing. Когда вещь, которую вы проверяете, всегда существует (в PHP результаты вызовов функций всегда существуют), функция empty() - не что иное, как оператор отрицания.

PHP не имеет понятия пустоты. Значения, которые вычисляют значение false, пусты, значения, которые оцениваются как истинные, являются непустыми. Это то же самое. Этот код:

$x = something();
if (empty($x)) …

и это:

$x = something();
if (!$x) …

имеет всегда тот же результат, во всех случаях, для всех типов данных (поскольку $x определен empty() является избыточным).

Возвращаемое значение из метода всегда существует (даже если у вас нет оператора return, существует возвращаемое значение и содержит null). Поэтому:

if (!empty($r->getError()))

логически эквивалентно:

if ($r->getError())

Ответ 2

Примечание: Это очень высокий голос с высокой видимостью, но обратите внимание, что это способствует плохой, ненужной практике кодирования! См. @Kornel answer для правильного пути.

Примечание # 2: Я одобряю предложения по использованию @Kornel answer. Когда я написал этот ответ три года назад, я просто хотел объяснить природу ошибки, не обязательно одобрять альтернативу. Ниже приведен фрагмент кода ниже.


Это ограничение empty() в версиях PHP ниже 5.5.

Примечание: empty() проверяет только переменные как все остальное приведет к анализу ошибка. Другими словами, следующее не будет работать: empty (trim ($ name)).

Вам нужно будет изменить этот

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

Ответ 3

В соответствии с документами:

empty() проверяет только переменные, поскольку что-то еще приведет к ошибке синтаксического анализа

Вы не можете использовать empty() непосредственно для возвращаемого значения функции. Вместо этого установите значение возврата из getError() в переменную и запустите empty() в переменной.

Ответ 4

Я обычно создаю глобальную функцию is_empty(), чтобы обойти эту проблему

function is_empty($var)
{ 
 return empty($var);
}

Тогда в любом месте, где я обычно использовал бы empty(), я просто использую is_empty()

Ответ 5

Как указывалось другими, это (странное) ограничение пустого().

Для большинства прорисов это делается так же, как вызов пустой, но это работает:

if ($r->getError() != '')

Ответ 6

Проблема в том, что вы хотите знать, не является ли ошибка пустой.

public function getError() {
    return $this->error;
}

Добавление метода isErrorSet() решит проблему.

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

Теперь это будет отлично работать с этим кодом без уведомления.

if (!($x->isErrorSet())) {
    echo $x->getError();
}

Ответ 7

Альтернативный способ проверить, является ли массив пустым, может быть:

count($array)>0

Он работает для меня без этой ошибки