在写入上下文中不能使用方法返回值

我会认为下面的一段代码应该可以工作,但不会(编辑:现在在PHP 5.5+中工作)

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

getError()简单来说就是:

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

但是,我最终得到这个错误:

在写入上下文中不能使用方法返回值

这是什么意思? 这不只是一个读取?

empty()需要通过引用来访问这个值(为了检查这个引用是否指向了某个存在的东西),而5.5之前的PHP不支持对从函数返回的临时值的引用。

然而,你真正的问题是你使用empty() ,错误地认为“空”的价值是任何不同于“假”。

空只是!isset($thing) || !$thing的别名 !isset($thing) || !$thing 。 当你检查的东西总是存在的时候(在PHP中,函数调用的结果总是存在的), empty()函数不过是一个否定运算符

PHP 没有空白的概念 。 评估为false的值为空,评估为true的值非空。 这是同一件事。 此代码:

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

和这个:

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

在所有情况下,对于所有的数据types,总是有相同的结果 (因为$x被定义为empty()是多余的)。

方法的返回值总是存在的(即使你没有return语句,返回值也是存在的,并且包含null )。 因此:

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

在逻辑上相当于:

 if ($r->getError()) 

注意:这是一个非常高的投票答案,具有很高的知名度,但请注意,它会促进糟糕的,不必要的编码实践! 请参阅@ Kornel的正确答案 。

注#2:我赞同使用@Kornel答案的build议。 当我三年前写这个答案的时候,我只是想解释错误的本质,不一定是赞同的。 下面的代码片段是不推荐的。


这是PHP版本低于5.5的空()的限制。

注意:empty()只检查variables,否则会导致分析错误。 换句话说,以下内容将不起作用:empty(trim($ name))。

你必须改变这一点

 // Not recommended, just illustrates the issue $err = $r->getError(); if (!empty($err)) 

根据PHP文档 :

empty()只检查variables,否则会导致parsing错误

你不能直接在函数的返回值上使用empty() 。 相反,将getError()的返回值设置为一个variables,并在variables上运行empty()

我通常创build一个叫做is_empty()的全局函数来解决这个问题

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

然后,我通常会使用空()我只是使用is_empty()

正如其他人指出的那样,这是一个(怪异的)空()的限制。

对于大多数的紫癜,这样做是相等的空调,但这是有效的:

 if ($r->getError() != '') 

问题是这个,你想知道错误是不是空的。

 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(); } 

检查一个数组是否为空的替代方法可能是:

 count($array)>0 

它适用于我没有这个错误