我认为下面这段代码应该可行,但它不是(已编辑:现在可以在PHP 5.5中运行):
if (!empty($r->getError()))
getError()
只是:
public function getError()
{
return $this->error;
}
然而我最终得到了这个错误:
不能在写上下文中使用方法返回值
这是什么意思?这不仅仅是一个阅读?
答案 0 :(得分:757)
empty()
需要通过引用访问该值(以便检查该引用是否指向存在的内容),并且5.5之前的PHP不支持对从函数返回的临时值的引用。
然而,你遇到的真正问题是你完全使用empty()
,错误地认为“空”值与“假”有任何不同。
Empty只是!isset($thing) || !$thing
的别名。当你检查的东西总是存在时(在函数调用的PHP结果中总是存在),empty()
函数只是一个否定运算符。
PHP 没有空虚概念。求值为false的值为空,求值为true的值为非空值。这是同一件事。这段代码:
$x = something();
if (empty($x)) …
和此:
$x = something();
if (!$x) …
对于所有数据类型 总是相同的结果(因为定义$x
empty()
是多余的)。
方法的返回值始终存在(即使您没有return
语句,返回值仍然存在且包含null
)。因此:
if (!empty($r->getError()))
在逻辑上等同于:
if ($r->getError())
答案 1 :(得分:329)
注意:这是一个非常高的投票答案,具有很高的知名度,但请注意,它会促进糟糕的,不必要的编码做法!请参阅@Kornel's answer了解正确的方法。
注意#2:我赞同使用@Kornel's answer的建议。当我三年前写这个答案时,我只是想解释错误的本质,而不一定认可另一种选择。不建议使用下面的代码段。
在5.5以下的PHP版本中,这是empty()的限制。
注意:empty()仅将变量检查为 其他任何东西都会导致解析 错误。换句话说,以下 不起作用:空(修剪($ name))。
您必须更改为此
// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))
答案 2 :(得分:37)
根据the PHP docs:
empty()只检查变量,否则会导致解析错误
您不能直接在函数的返回值上使用empty()
。相反,将getError()
的返回值设置为变量并在变量上运行empty()
。
答案 3 :(得分:19)
我通常创建一个名为is_empty()的全局函数来解决这个问题
function is_empty($var)
{
return empty($var);
}
然后我通常使用empty()的任何地方我只使用is_empty()
答案 4 :(得分:4)
正如其他人所指出的,它是empty()的一个(奇怪的)限制。
对于大多数的purproses来说,这样做与调用empty相同,但这样做有效:
if ($r->getError() != '')
答案 5 :(得分: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();
}
答案 6 :(得分:0)
我不确定这是否是常见错误,但是如果您执行以下操作:
$var = 'value' .= 'value2';
这也会产生相同的错误
不能在写上下文中使用方法返回值
同一条语句中不能包含=
和.=
。您可以使用其中一个,但不能同时使用。
请注意,我知道这与问题中的实际代码无关,但是,此问题是搜索错误消息时的最高结果,因此我想在此处发布以保持完整性。
答案 7 :(得分:-3)
检查数组是否为空的替代方法可能是:
count($array)>0
没有那个错误它对我有用