提问人:CarlosCarucce 提问时间:1/18/2023 更新时间:1/18/2023 访问量:123
使用 splat 运算符时按引用传递 (...)
Pass by reference when using splat operator (...)
问:
我有两个功能。其中一个接收并修改通过引用传递的数组中的某些值。
function dostuff ($param1, $param2, &$arr) {
//...
//add new elements to $arr
}
另一个是类中的一个方法,它包装了第一个方法:
class Wrapper
{
public function foo (...$args) {
return dostuff(...$args);
}
}
但是,如果我将数组传递给“foo”,则数组保持不变。
我试图用一个声明,但这导致了语法错误。foo(... &$args)
&
在 PHP 中使用 splat 运算符时,有没有办法通过引用传递参数?
答:
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)
评论
dostuff
foo