我认为下面的代码应该工作,但它没有(编辑:现在工作在PHP 5.5+):
if (!empty($r->getError()))
其中getError()简单地为:
getError()
public function getError() { return $this->error; }
然而,我最终得到了这个错误:
不能在写上下文中使用方法返回值
这是什么意思?这难道不只是一次阅读吗?
在PHP 5.5之前,PHP文档表示:
Empty()只检查变量,否则将导致解析错误
在PHP <5.5你不能直接在函数的返回值上使用empty()。相反,你可以将getError()的返回值赋值给一个变量,然后对该变量运行empty()。
empty()
在PHP >= 5.5中,这不再是必要的。
注意:这是一个非常高的投票和能见度的答案,但请注意,它促进了糟糕的,不必要的编码实践!正确的方法参见@Kornel的回答。 我支持使用@Kornel的回答的建议。当我三年前写下这个答案时,我只是想解释这个错误的本质,并不一定赞同另一种选择。不建议使用下面的代码片段。
注意:这是一个非常高的投票和能见度的答案,但请注意,它促进了糟糕的,不必要的编码实践!正确的方法参见@Kornel的回答。
我支持使用@Kornel的回答的建议。当我三年前写下这个答案时,我只是想解释这个错误的本质,并不一定赞同另一种选择。不建议使用下面的代码片段。
这是PHP 5.5以下版本中空()的限制。
注意:empty()只检查变量as 任何其他操作都将导致解析 错误。换句话说,就是 将不工作:empty(trim($name)).
你得换这个
// Not recommended, just illustrates the issue $err = $r->getError(); if (!empty($err))
正如其他人指出的那样,这是empty()的(奇怪的)限制。
对于大多数目的,这样做等同于调用empty,但这是有效的:
if ($r->getError() != '')
empty()需要通过引用访问该值(以检查该引用是否指向存在的东西),而5.5之前的PHP不支持引用函数返回的临时值。
然而,真正的问题是你根本就使用了empty(),错误地认为“empty”值与“false”值有任何不同。
Empty只是!isset($thing) || !$thing的别名。当你要检查的东西总是存在(在PHP中函数调用的结果总是存在),empty()函数就是只是一个否定运算符。
!isset($thing) || !$thing
PHP 没有空的概念。取值为false的值为空,取值为true的值为非空。这是一样的。这段代码:
$x = something(); if (empty($x)) …
这:
$x = something(); if (!$x) …
有在所有情况下,所有数据类型的结果总是相同的(因为$x被定义为empty()是多余的)。
$x
方法的返回值始终存在(即使你没有return语句,返回值也存在并且包含null)。因此:
return
null
逻辑上等价于:
if ($r->getError())
我通常创建一个名为is_empty()的全局函数来解决这个问题
function is_empty($var) { return empty($var); }
然后在任何我通常使用empty()的地方,我只使用is_empty()
问题是,你想知道错误是否为空。
添加一个方法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
对我来说没有错误
我不确定这是否是一个常见的错误,但如果你这样做:
$var = 'value' .= 'value2';
这也会产生同样的错误
=和.=不能出现在同一个语句中。你可以使用其中一种,但不能同时使用两种。
=
.=
注意,我知道这与问题中的实际代码无关,但是在搜索错误消息时,这个问题是最重要的结果,所以为了完整起见,我想在这里发布它。