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


465

我认为以下代码应该可以工作,但是不能(编辑:现在可以在PHP 5.5+中工作)

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

getError()简单地在哪里:

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

但是我最终遇到了这个错误:

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

这是什么意思?这不只是阅读吗?


2
可能在PHP 5.5中,您将被允许将表达式传递给emptywiki.php.net/rfc/empty_isset_exprs
CarlosCampderrós2012年


好的,我发现porneL的答案也 正确,这也是我的代码if ( !$e->find('div') ) ,该代码 检查当前HTML DOM元素是否为空。我在循环内部使用它仅打印出单个Div,而在内部没有内部Div。
塞勒姆2015年

Answers:


769

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

但是,真正的问题是您使用了 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())

29
这个答案比当前选择的答案要好得多。
SystemParadox

20
@gcb:否,PHP手册明确指出了相同之处:“ empty()与的相反(boolean) var,不同之处在于未设置变量时不生成警告。”
Kornel

16
不生成警告部分非常重要... empty($ var)如果为0,'',array(),NULL甚至未定义,则将返回true。这是很好的做法,尤其是这样你就可以登录你的真正的警告,没有文件占满
landons

3
好的,很好的答案,但是避免这种情况的正确方法是什么,有人知道吗?
Javatar

3
@EugenMihailescu普遍认为是确定的,但它并不完全等同于空的(),因为""0等都是“空”,但不能为null。
Kornel 2014年

330

注意:这是一个投票率很高,可见度很高的答案,但是请注意,它会促进不良的不必要的编码做法!有关正确方法,请参见@Kornel的答案

注意#2:我赞同使用@Kornel的答案的建议。三年前我写这个答案时,我只是要解释错误的性质,而不一定要认可替代方法。不建议使用以下代码段。


在低于5.5的PHP版本中,这是对empty()的限制。

注意:Empty()仅检查变量,否则将导致解析错误。换句话说,以下内容将不起作用:empty(trim($ name))。

您必须更改为此

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

156
这真是适得其反。
大卫·默多克

47
注意:的情况也是如此isset()。即:isset($this->foo->getBar())将导致相同的问题。
catchdave 2011年

7
porneL的答案以更好的解决方案更详细地说明了这一点
SystemParadox

5
@SystemParadox-取决于“更好”的意思。使用“更清洁”的解决方案,porneL的答案可以说是更彻底的,但实际上也不能解释错误的起因。
彼得·贝利

4
因为没错,@ deceze。这不是最好的答案,您在那儿不会收到我的任何论点。我什至投票赞成porneL自己。这是一个很老的答案,但这没有。关于高票:请记住,porneL在此之后整整17个月才到来。
彼得·贝利

37

根据PHP文档

empty()仅检查变量,否则将导致解析错误

您不能empty()直接在函数的返回值上使用。而是将返回值设置getError()为变量并empty()在该变量上运行。


19

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

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

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


2
最好不要这样做并坚持标准(可能会令人讨厌)。
tonyhb

1
@dynamism您能解释为什么吗?
Janis Veinbergs 2011年

1
因为便捷功能可能很难读懂别人的代码。另外,在MVC / HMVC体系结构中,它可能会使您的结构混乱。归根结底,PHP编码人员应该知道它的局限性,并且能够在没有便利功能的情况下理解较小的解决方法。
tonyhb 2011年

14
哇,您刚刚发明了求反函数。您知道PHP !为此有运算符吗?:)
Kornel

4

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

对于大多数钱包而言,执行此操作等同于调用为空,但这可以起作用:

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

5
这是不正确的- empty()除了空白字符串外,还包含更多的可能性
Robbie Averill

3
这就是为什么它说“对于大多数目的 ”,而不是全部
Jani Hartikainen 2015年

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

-3

检查数组是否为空的另一种方法是:

count($array)>0

它对我来说没有错误

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.