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

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

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

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

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

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

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

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

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

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

Пусто – это просто псевдоним !isset($thing) || !$thing !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: Я одобряю предложения по использованию ответа Корнеля . Когда я написал этот ответ три года назад, я просто хотел объяснить природу ошибки, не обязательно одобрять альтернативу. Ниже приведен фрагмент кода ниже.


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

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

Вам придется перейти на это

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

Согласно документам PHP :

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

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

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

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

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

Как отмечают другие, это (странное) ограничение пустого ().

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

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

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

 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(); } 

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

 count($array)>0 

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