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

时间:2009-07-02 16:58:37

标签: php

我认为下面这段代码应该可行,但它不是(已编辑:现在可以在PHP 5.5中运行)

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

getError()只是:

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

然而我最终得到了这个错误:

  

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

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

8 个答案:

答案 0 :(得分:757)

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

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

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

答案 1 :(得分:329)

  

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

     

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


在5.5以下的PHP版本中,这是empty()的限制。

  

注意:empty()仅将变量检查为   其他任何东西都会导致解析   错误。换句话说,以下   不起作用:空(修剪($ name))。

您必须更改为此

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

答案 2 :(得分:37)

根据the PHP docs

  

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

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

答案 3 :(得分:19)

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

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

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

答案 4 :(得分:4)

正如其他人所指出的,它是empty()的一个(奇怪的)限制。

对于大多数的purproses来说,这样做与调用empty相同,但这样做有效:

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

答案 5 :(得分: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();
}

答案 6 :(得分:0)

我不确定这是否是常见错误,但是如果您执行以下操作:

$var = 'value' .= 'value2';

这也会产生相同的错误

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

同一条语句中不能包含=.=。您可以使用其中一个,但不能同时使用。

请注意,我知道这与问题中的实际代码无关,但是,此问题是搜索错误消息时的最高结果,因此我想在此处发布以保持完整性。

答案 7 :(得分:-3)

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

count($array)>0

没有那个错误它对我有用