首页 > 解决方案 > 注意:只能通过引用返回变量引用

问题描述

我收到此通知:

注意:只能通过引用返回变量引用

private function &getPageByLabel(&$pages, $label){
    foreach($pages as &$page){
        if($page['label'] == $label) return $page;
    }
    return false; //THIS IS THE LINE THAT THE ERROR MESSAGE MENTIONS
}

我正在使用 ZF 1.12 和 PHP 5.5.9

标签: php

解决方案


您的函数指定它返回对变量的引用(这意味着它不复制值,它完全传递函数内部的版本)。

由于您返回一个常量,因此没有与此关联的变量,因此它不应该工作。虽然 PHP 很友好,但它会将您要写的内容解释为:

private function &getPageByLabel(&$pages, $label){
    foreach($pages as &$page){
        if($page['label'] == $label) return $page;
    }
    $return_value = false;
    return $return_value;
}

删除&之前getPageByLabel将删除错误,因为现在您将返回(复制的)值而不是引用。

尽管请注意,这可能会导致您的代码出现故障,因为您希望引用您的其中一个$pages,可能会在外部对其进行修改。如果没有引用,您只需在外部修改副本,而$pagein$pages将保持不变。

更好的方法可能是创建一个“虚拟对象”来返回。

您可以创建一个名为“虚拟页面”$no_page并返回它而不是false. 然后在外部,您应该能够通过以下方式确定页面是否存在:

$page = $x->getPageByLabel(...); 
if ($page === $x->no_page) {
    // no page found!
}

一个更简洁的选择是先检查是否存在,尽管它会稍微慢一些:

private function pageExistsWithlabel(&$pages, $label) {
    foreach ($pages as $page) {
        if ($page['label'] == $label) return true;
    }
    return false;
}

private function &getPageByLabel(&$pages, $label){
    foreach($pages as &$page){
        if($page['label'] == $label) return $page;
    }
    // throw an error here
}

if (! $x->pageExistsWithlabel(...)) {
    // handle the case where the page does not exist to prevent the error
} else {
    $page = $x->getPageByLabel(...);
}


推荐阅读