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

Ext*_*kun 461 php

我认为下面的代码应该可以工作,但它没有(编辑:现在适用于PHP 5.5+):

if (!empty($r->getError()))
Run Code Online (Sandbox Code Playgroud)

其中getError()无非是:

public function getError()
{
    return $this->error;
}
Run Code Online (Sandbox Code Playgroud)

但我最终得到了这个错误:

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

这是什么意思?这不仅仅是一个阅读?

Kor*_*nel 763

empty() 需要通过引用访问该值(以便检查该引用是否指向存在的内容),并且5.5之前的PHP不支持对从函数返回的临时值的引用.

然而,你遇到的真正问题是你完全使用empty(),错误地认为"空"值与"假"有任何不同.

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

PHP 没有空洞的概念.求值为false的值为空,求值为true的值为非空值.这是同一件事.这段代码:

$x = something();
if (empty($x)) …
Run Code Online (Sandbox Code Playgroud)

还有这个:

$x = something();
if (!$x) …
Run Code Online (Sandbox Code Playgroud)

已经总是相同的结果,在所有的情况下,对于所有的数据类型(因为$x被定义empty()为冗余的).

方法的返回值始终存在(即使您没有return语句,返回值存在且包含null).因此:

if (!empty($r->getError()))
Run Code Online (Sandbox Code Playgroud)

在逻辑上等同于:

if ($r->getError())
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比目前选择的答案要好得多的答案. (29认同)
  • @gcb:不,PHP手册明确说明它是相同的:*"empty()与`(boolean)var`相反,除了没有设置变量时不会产生警告."* (19认同)
  • 不生成警告部分非常重要...如果它是0,'',array(),NULL或甚至没有定义,则empty($ var)将返回true.这是一个很好的做法,特别是你可以在没有文件填满的情况下记录你的*真实*警告 (16认同)
  • 好的,很好的答案,但是什么是避免这种情况的正确方法,有人知道吗? (3认同)
  • @EugenMihailescu一般来说没关系,但它并不完全等同于empty(),因为``"`,`0`等是"空",但不是null. (3认同)

Pet*_*ley 330

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

注意#2:我赞同使用@Kornel答案的建议.当我三年前写这个答案时,我只是想解释错误的本质,而不一定认可另一种选择.不建议使用下面的代码段.


这是5.5以下PHP版本中empty()的限制.

注意:empty()仅检查变量,因为其他任何内容都会导致解析错误.换句话说,以下内容不起作用:empty(trim($ name)).

你必须改变这个

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

  • 这极其适得其反. (155认同)
  • 注意:`isset()`也是如此.ie:`isset($ this-> foo-> getBar())`会导致同样的问题. (47认同)
  • porneL的答案通过更好的解决方案更详细地解释了这一点 (7认同)
  • @SystemParadox - 取决于你所说的"更好".对于"更清洁"的解决方案,porneL的答案可以说更彻底,但实际上也没有解释错误的根源. (5认同)
  • 因为没错,@ deceze.这不是最好的答案,你不会在那里得到我的任何论据.我甚至自己投了porneL's.这是一个*非常古老的*答案,但它不是*错*.关于高票:记住,porneL在此之后差不多整整17个月到来了. (4认同)
  • 同意,porneL的答案比这个答案好很多. (2认同)

Geo*_*orn 37

根据PHP文档:

empty()只检查变量,因为其他任何东西都会导致解析错误

您不能empty()直接在函数的返回值上使用.相反,将返回值设置getError()为变量并empty()在变量上运行.


小智 19

我通常创建一个名为is_empty()的全局函数来解决这个问题

function is_empty($var)
{ 
 return empty($var);
}
Run Code Online (Sandbox Code Playgroud)

然后我通常使用empty()的任何地方我只使用is_empty()

  • 哇,你刚刚发明了*否定函数*.你知道PHP有`!`运算符吗?:) (14认同)
  • 最好不要这样做并坚持标准(尽管它们可能很烦人). (2认同)