使用 splat 运算符时按引用传递 (...)

Pass by reference when using splat operator (...)

提问人:CarlosCarucce 提问时间:1/18/2023 更新时间:1/18/2023 访问量:123

问:

我有两个功能。其中一个接收并修改通过引用传递的数组中的某些值。

function dostuff ($param1, $param2, &$arr) {
    //...
    //add new elements to $arr
}

另一个是类中的一个方法,它包装了第一个方法:

class Wrapper
{
    public function foo (...$args) {
        return dostuff(...$args);
    }
}

但是,如果我将数组传递给“foo”,则数组保持不变。 我试图用一个声明,但这导致了语法错误。foo(... &$args)&

在 PHP 中使用 splat 运算符时,有没有办法通过引用传递参数?

PHP 运算符 按引用传递

评论

0赞 CarlosCarucce 1/18/2023
@Anant-Alivetodie 像这样:3v4l.org/1GKCh
0赞 Alive to die - Anant 1/18/2023
你可以这样做:3v4l.org/nKUlS3v4l.org/4kg0u
0赞 CarlosCarucce 1/18/2023
@Anant-Alivetodie 即使它定义的类范围之外,也可以修改。这就是为什么我们将最后一个参数作为参考。示例:3v4l.org/49XlX
0赞 CarlosCarucce 1/18/2023
我不得不打电话而不是dostufffoo
0赞 Alive to die - Anant 1/18/2023
哦,知道了。然后你可以按照下面发布的答案去

答:

2赞 Foobar 1/18/2023 #1

对于 PHP 8.x 版本 https://3v4l.org/9ivmL

这样做是这样的:

<?php

class Wrapper
{
    public function foo (&...$args) {
        return $this->dostuff(...$args);
    }

    public function dostuff($param1, $param2, &$arr) {
        $arr[] = $param1;
        $arr[] = $param2;

        return count($arr);
    }
}


$values = [1,2];
$a=3;
$b=4;
$obj = new Wrapper();
#all parameter must be variables here because there are by ref now
$count = $obj->foo($a,$b, $values);

echo "Elements count: $count\r\n";
print_r($values); //Expected [1,2,3,4]

输出

Elements count: 4
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

请参阅:https://www.php.net/manual/en/functions.arguments.php 示例 #13

评论

0赞 CarlosCarucce 1/18/2023
你好。这给了我一个致命的错误:Fatal error: Uncaught Error: Wrapper::foo(): Argument #1 cannot be passed by reference
0赞 Foobar 1/18/2023
@CarlosCarucce 这是用 php 8.x 测试的 3v4l.org/9ivmL
0赞 Foobar 1/18/2023
@Anant-Alivetodie 它是OP代码的更新版本 3v4l.org/1GKCh
0赞 CarlosCarucce 1/18/2023
是的。但实际上,这用于路由系统的 Facade 类中。为了简单起见,我才这样
0赞 Foobar 1/18/2023
@CarlosCarucce 而我刚才向你展示了必须放置的,而不是,有效的是。&foo(... &$args)foo(&...$args)