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

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

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

кудаgetError() это просто:

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

Все же я в конечном итоге с этой ошибкой:

can't use method return value in write context

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

 Carlos Campderrós31 июл. 2012 г., 09:44
Вероятно, в PHP 5.5 вам будет разрешено передавать выраженияempty: wiki.php.net/rfc/empty_isset_exprs
 deceze♦31 июл. 2012 г., 10:04
 Salem22 июн. 2015 г., 20:17
Хорошо я нахожуporneL's Answer   исправьте тоже мой кодif ( !$e->find('div') )  эта проверка, если текущий элемент HTML DOM пуст или нет. Я использую его внутри цикла, чтобы распечатать только один Div без внутреннего Div внутри.

Ответы на вопрос(7)

чтобы обойти эту проблему

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

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

 19 сент. 2011 г., 16:57
@dynamism вы могли бы объяснить, почему нет?
 26 сент. 2011 г., 22:24
Потому что удобные функции могут быть трудными для чтения в чужом коде. Кроме того, в архитектуре MVC / HMVC это может испортить вашу структуру. В конце концов, PHP-кодеры должны знать о его ограничениях и уметь понимать небольшие обходные пути без вспомогательных функций.
 16 авг. 2011 г., 11:52
Лучше не делать этого и придерживаться стандартов (какими бы раздражающими они ни были).
 05 окт. 2011 г., 01:34
Вау, вы только что изобрелиnegation function, Вы знаете, что PHP имеет! оператор для этого? :)
Решение Вопроса

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

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

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

PHPdoesn't have concept of emptyness, Значения, которые оцениваются как ложные, являются пустыми, значения, которые оцениваются как истинные, не являются пустыми. Это то же самое. Этот код:

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

и это:

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

имеетalways the same result, in all cases, for all datatypes (так как$x определеноempty() является излишним).

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

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

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

if ($r->getError())
 09 сент. 2011 г., 16:20
Это гораздо лучший ответ, чем тот, который выбран в настоящее время.
 11 апр. 2014 г., 13:19
@EugenMihailescu в целом, это нормально, но это не является строго эквивалентным empty (), потому что"", 0и т. д. являются «пустыми», но не равны нулю.
 20 янв. 2013 г., 23:34
Хорошо, отличный ответ, но как правильно избежать этого, кто-нибудь знает?
 05 окт. 2011 г., 01:33
@ gcb: нет, руководство по PHP явно говорит, что оно идентично:"empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set."
 15 нояб. 2011 г., 15:15
Не генерировать предупреждающую часть очень важно ... empty ($ var) вернет true, если он равен 0, 'array (), NULL или даже не определен. Это хорошая практика, особенно если выreal предупреждения без заполнения файлов

count($array)>0

У меня работает без этой ошибки

Note: This is a very high voted answer with a high visibility, but please note that it promotes bad, unnecessary coding practices! See @Kornel's answer for the correct way.

Note #2: I endorse the suggestions to use @Kornel's answer. When I wrote this answer three years ago, I merely meant to explain the nature of the error, not necessarily endorse the alternative. The code snippet below is not recommended.

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

Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

Вы должны перейти на это

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))
 23 дек. 2010 г., 21:26
Это безумно контрпродуктивно.
 09 сент. 2011 г., 16:21
Ответ PorneL объясняет это более подробно с лучшим решением
 25 июн. 2011 г., 01:45
Примечание: то же самое относится и кisset(), то есть:isset($this->foo->getBar()) приведет к тому же вопросу.
 08 янв. 2011 г., 00:40
@ Дэвид Мердок php полон маленьких драгоценных камней, как это ...
 13 сент. 2011 г., 00:22
@SystemParadox - Зависит от того, что вы подразумеваете под «лучше». ответ porneL, возможно, более тщательный, чем «чище» решение, но также фактически не объясняет причину ошибки.

PHP документы:

empty() only checks variables as anything else will result in a parse error

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

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

if ($r->getError() != '')
 07 апр. 2015 г., 08:49
Вот почему он говорит "для"most purposes& quot; неall
 07 апр. 2015 г., 05:44
Это не так -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();
}

Ваш ответ на вопрос