Я бы подумал, что следующий фрагмент кода должен работать, но он не (Отредактировано: теперь работает в PHP 5.5 +):
if (!empty($r->getError()))
Где getError()
просто:
public function getError()
{
return $this->error;
}
И все же я получаю эту ошибку:
не может использовать возвращаемое значение метода в контексте записи
Что это значит? Разве это не просто чтение?
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())
Примечание: Это очень высокий голос с высокой видимостью, но обратите внимание, что это способствует плохой, ненужной практике кодирования! См. @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))
В соответствии с документами:
empty() проверяет только переменные, поскольку что-то еще приведет к ошибке синтаксического анализа
Вы не можете использовать empty()
непосредственно для возвращаемого значения функции. Вместо этого установите значение возврата из getError()
в переменную и запустите empty()
в переменной.
Я обычно создаю глобальную функцию is_empty(), чтобы обойти эту проблему
function is_empty($var)
{
return empty($var);
}
Тогда в любом месте, где я обычно использовал бы empty(), я просто использую is_empty()
Как указывалось другими, это (странное) ограничение пустого().
Для большинства прорисов это делается так же, как вызов пустой, но это работает:
if ($r->getError() != '')
empty()
охватывает гораздо больше возможностей, чем просто пустая строка
Проблема в том, что вы хотите знать, не является ли ошибка пустой.
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
Он работает для меня без этой ошибки
empty
: wiki.php.net/rfc/empty_isset_exprs