我认为下面的代码应该工作,但它没有(编辑:现在工作在PHP 5.5+):
if (!empty($r->getError()))
其中getError()是简单的:
public function getError()
{
return $this->error;
}
然而,我最终得到了这个错误:
不能在写上下文中使用方法返回值
这是什么意思?这难道不只是一次阅读吗?
我认为下面的代码应该工作,但它没有(编辑:现在工作在PHP 5.5+):
if (!empty($r->getError()))
其中getError()是简单的:
public function getError()
{
return $this->error;
}
然而,我最终得到了这个错误:
不能在写上下文中使用方法返回值
这是什么意思?这难道不只是一次阅读吗?
当前回答
empty()需要通过引用访问该值(以检查该引用是否指向存在的东西),而5.5之前的PHP不支持引用函数返回的临时值。
然而,真正的问题是您根本就使用了empty(),错误地认为“empty”值与“false”值有任何不同。
Empty只是!isset($thing) || !$thing的别名。当你要检查的东西总是存在(在PHP中函数调用的结果总是存在),empty()函数只是一个否定运算符。
PHP没有空的概念。取值为false的值为空,取值为true的值为非空。这是一样的。这段代码:
$x = something();
if (empty($x)) …
这:
$x = something();
if (!$x) …
在所有情况下,对于所有数据类型总是具有相同的结果(因为$x定义为empty()是多余的)。
方法的返回值始终存在(即使你没有返回语句,返回值也存在并且包含null)。因此:
if (!empty($r->getError()))
逻辑上等价于:
if ($r->getError())
其他回答
我不确定这是否是一个常见的错误,但如果你这样做:
$var = 'value' .= 'value2';
这也会产生同样的错误
不能在写上下文中使用方法返回值
你不能把an =和a .=放在同一个语句中。你可以使用其中一种,但不能同时使用两种。
注意,我知道这与问题中的实际代码无关,但是在搜索错误消息时,这个问题是最重要的结果,所以为了完整起见,我想在这里发布它。
问题是,你想知道错误是否为空。
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();
}
在PHP 5.5之前,PHP文档经常说:
Empty()只检查变量,否则将导致解析错误
在PHP < 5.5中,你不能直接在函数的返回值上使用empty()。相反,您可以将getError()的返回值赋值给一个变量,并在该变量上运行empty()。
在PHP >= 5.5中,这不再是必要的。
empty()需要通过引用访问该值(以检查该引用是否指向存在的东西),而5.5之前的PHP不支持引用函数返回的临时值。
然而,真正的问题是您根本就使用了empty(),错误地认为“empty”值与“false”值有任何不同。
Empty只是!isset($thing) || !$thing的别名。当你要检查的东西总是存在(在PHP中函数调用的结果总是存在),empty()函数只是一个否定运算符。
PHP没有空的概念。取值为false的值为空,取值为true的值为非空。这是一样的。这段代码:
$x = something();
if (empty($x)) …
这:
$x = something();
if (!$x) …
在所有情况下,对于所有数据类型总是具有相同的结果(因为$x定义为empty()是多余的)。
方法的返回值始终存在(即使你没有返回语句,返回值也存在并且包含null)。因此:
if (!empty($r->getError()))
逻辑上等价于:
if ($r->getError())
我通常创建一个名为is_empty()的全局函数来解决这个问题
function is_empty($var)
{
return empty($var);
}
然后在任何我通常使用empty()的地方,我只使用is_empty()