首页 文章

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

提问于
浏览
450

我认为下面的代码应该可以工作,但它不是 (Edited: Now works in PHP 5.5+)

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

getError() 的简单地说:

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

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

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

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

7 回答

  • 328

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

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

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

    PHP doesn't have concept of emptyness . 求值为false的值为空,求值为true的值为非空值 . 这是同一件事 . 这段代码:

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

    还有这个:

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

    always the same result, in all cases, for all datatypes (因为 $x 被定义 empty() 是多余的) .

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

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

    在逻辑上等同于:

    if ($r->getError())
    
  • 4

    注意:这是一个非常高的投票答案,具有很高的知名度,但请注意,它会促进不良的,不必要的编码实践!请参阅@ Kornel的答案,了解正确的方法 . 注意#2:我赞同使用@Kornel答案的建议 . 当我三年前写这个答案时,我只是想解释错误的本质,而不一定支持替代方案 . 不建议使用下面的代码段 .


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

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

    你必须改变这个

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

    根据the PHP docs

    empty()仅检查变量,因为其他任何内容都会导致解析错误

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

  • -3

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

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

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

  • 2

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

    对于大多数的purproses,这样做就像调用empty一样,但是这样可行:

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

    问题是这样,你想知道错误是否为空 .

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

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

    count($array)>0
    

    没有那个错误,它对我有用

相关问题