Я бы подумал, что следующий фрагмент кода должен работать, но он не работает (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
Это работает для меня без этой ошибки