【问题标题】:Assign array value by function return reference通过函数返回引用分配数组值
【发布时间】:2013-04-11 19:57:38
【问题描述】:

我想为一个数组元素赋值,该元素由一个带有引用参数的函数返回。代码:

function f(&$y) {
    return $y;
}

$y = '';

$x = array(
        'a' => 1,
        'b' => 2,
        'c' => f($y)
        );
var_dump($x); // 'c' is empty

$y = 3;

var_dump($x); // 'c' is still empty

我很确定在这种情况下我把整个参考资料都弄错了。即使我尝试通过引用(如function &f(&y) {})返回,仍然无法正常工作。

【问题讨论】:

  • 函数 f() 返回 $y 的值,并在 $x 数组中设置。 $y 的第二次分配根本不会影响这一点。但这个理论是在精心设计,还是您实际上是在尝试实现某些目标?
  • 您也需要通过引用返回。

标签: php pass-by-reference


【解决方案1】:

如果您希望通过函数调用实现此功能(您也可以直接为 $y 别名),那么您需要使用按引用返回(请参阅:Returning References),请参阅 @函数名前987654324@符号:

function &f(&$y) {
    return $y;
}

您还需要为该引用设置别名(需要一些特殊处理以使 PHP 解析器允许这样做):

$y = '';

$x = array(
        'a' => 1,
        'b' => 2,
        'c' => &${${''}=&f($y)?!1:!1},
);

See it in action.

【讨论】:

    【解决方案2】:

    你应该试试

    $x = array(
        'a' => 1,
        'b' => 2,
        'c' => &$y
        );
    

    【讨论】:

    • 不,该函数除了返回 $y 的普通值之外还做了其他事情
    【解决方案3】:

    首先,警告:这种代码太混乱了,只有在受到枪口威胁时才应该这样做。当他们不得不像这样调试代码时,你未来的自己会讨厌你。

    也就是说,要完成这项工作,您需要“moar references”:

    function &f(&$y) { // two ref-signs here...
        return $y;
    }
    
    $y = '';
    $x = array(
        'a' => 1,
        'b' => 2,
        'c' => &f($y) // ..and one more here
    );
    

    但是,上面仍然是does not compile(我不知道为什么,会在时间允许的时候调查)因为在创建数组的过程中似乎不允许你这样做。但这有效:

    $y = '';
    $x = array('a' => 1, 'b' => 2);
    $x['c'] = &f($y); // seems this guy needs to be alone
    
    $y = 3;
    print_r($x);
    

    See it in action.

    【讨论】:

    • 那是因为 PHP 解析器。从技术上讲是可能的:'c' => &${${''}=&f($y)?!1:!1},.
    • @M8R-1jmw5r:我担心它会是这样的,因为 PHP (显然没有技术原因这不会飞)。坦率地说,我不会因为交付这种代码而被抓到死,而是 +1 表示努力。
    • 谢谢,确切地说,我也无法想象为什么它不起作用。
    • 对,这应该可行,但它会引发致命错误Can't use function return value in write context。乔恩,相信我,我未来的自己无论如何都会恨我的。我需要给'c'一个strtotime返回引用,但由于我不能再通过引用传递参数,所以我正在寻找其他选项。无论如何,谢谢你们。
    【解决方案4】:

    根据 PHP 手册的快速浏览,您的 array() 语法似乎缺少逗号。

    $x = array(
        'a' => 1,
        'b' => 2,
        'c' => f($y)
        );
    

    应该是

    $x = array(
        'a' => 1,
        'b' => 2,
        'c' => f($y),
        );
    

    来源:http://php.net/manual/en/language.types.array.php

    我好多年没写PHP了,我就按照作者放的例子来吧。

    【讨论】:

    • 错误。逗号是可选的,不是必需的。
    猜你喜欢
    • 2011-07-18
    • 2012-09-26
    • 2022-01-16
    • 1970-01-01
    • 2020-09-01
    • 2015-05-31
    • 2017-04-15
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多