在写入上下文中不能使用方法返回值
我会认为下面的一段代码应该可以工作,但它不会(编辑:现在在PHP 5.5+中工作) :
if (!empty($r->getError()))
getError()
简单来说就是:
public function getError()
{
return $this->error;
}
然而我最终发现了这个错误:
在写入上下文中不能使用方法返回值
这是什么意思? 这不仅仅是一个阅读?
empty()
需要通过引用访问值(为了检查该引用是否指向存在的东西),并且5.5之前的PHP不支持对从函数返回的临时值的引用。
然而,你真正的问题是你完全使用empty()
,错误地认为“空”的价值与“假”的任何不同。
Empty只是!isset($thing) || !$thing
的别名 !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())
注意:这是一个非常高的投票答案,具有很高的知名度,但请注意,它会促进糟糕的不必要的编码实践! 请参阅@ Kornel的正确答案。
注#2:我赞同使用@Kornel答案的建议。 当我三年前写这个答案时,我只是想解释错误的性质,并不一定赞同这个选择。 不推荐下面的代码片段。
这是PHP版本低于5.5的空()的限制。
注意:empty()只检查变量,否则会导致分析错误。 换句话说,以下内容不起作用:空(trim($ name))。
你必须改变这一点
// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))
根据PHP文档:
empty()只检查变量,否则会导致分析错误
你不能直接在函数的返回值上使用empty()
。 相反,将getError()
的返回值设置为一个变量,并在变量上运行empty()
。
上一篇: Can't use method return value in write context
下一篇: iPhone iOS: how to detect when in roaming? (Not for jailbreaked phones)