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

432

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

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

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

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

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

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

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

  • 2
    Вероятно, в PHP 5.5 вам будет разрешено передавать выражения empty : wiki.php.net/rfc/empty_isset_exprs
Показать ещё 1 комментарий
Теги:

7 ответов

684
Лучший ответ

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())
  • 29
    Это гораздо лучший ответ, чем тот, который выбран в настоящее время.
  • 1
    empty () равно! $ x для большинства целей, а не для всех типов var.
Показать ещё 10 комментариев
343

Примечание: Это очень высокий голос с высокой видимостью, но обратите внимание, что это способствует плохой, ненужной практике кодирования! См. @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))
  • 155
    Это безумно контрпродуктивно.
  • 29
    @ Дэвид Мердок php полон маленьких драгоценных камней, как это ...
Показать ещё 7 комментариев
37

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

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

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

18

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

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

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

  • 2
    Лучше не делать этого и придерживаться стандартов (какими бы раздражающими они ни были).
  • 1
    @dynamism не могли бы вы объяснить, почему нет?
Показать ещё 2 комментария
5

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

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

if ($r->getError() != '')
  • 5
    Это не так - empty() охватывает гораздо больше возможностей, чем просто пустая строка
  • 3
    Вот почему он говорит «для большинства целей », не все
2

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

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

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

count($array)>0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню