有没有办法在 php 中通过引用传递临时数组?[已结束]

Is there a way to pass temporary arrays by reference in php? [closed]

提问人:rhavin 提问时间:10/29/2021 更新时间:10/29/2021 访问量:85

问:


想改进这个问题吗?通过编辑这篇文章来更新问题,使其仅关注一个问题。

2年前关闭。

考虑一个简单的函数:

function pass(&$arr)
{
  // do something
}

如果我这样称呼它......

$a = [1,2,3];
pass($a);

...这将起作用。但是,如果我这样做,...

pass([1,2,3]);

...它将失败,并出现错误 Cannot pass parameter 1 by reference

为什么在数组有效的函数作用域中无法获得对临时数组的引用?

PHP 数组 按引用传递

评论

2赞 exussum 10/29/2021
你期望会发生什么?这样调用它没有多大意义,因为传递 ref 意味着您将以某种方式在函数中更改其值
0赞 rhavin 10/29/2021
@exussum是的,你甚至可以把它放在课堂上,但你可能不再需要它了。这就是为什么在这些情况下可以使用临时数组的原因。此外,您可能不想依赖延迟复制,这不是语言固有的,而是实现固有的。
1赞 Jaquarh 10/29/2021
使用 just 意味着您将变量的(它指向的地方)传递给函数。如果没有存储变量,您将如何重新调用?这毫无意义。&zval[1,2,3]
0赞 rhavin 10/29/2021
@Jaquarh好吧,如果你将 [1,2,3] 传递给函数,它必须指向某个地方,对吧?
0赞 Jaquarh 10/29/2021
修改一些程序集,或者 C,它对你来说会更有意义。

答:

2赞 anees 10/29/2021 #1

好吧,你不能那样做...... 根据 php 手册:只有变量应该通过引用传递

虽然你可以创建一个函数,在其作用域中创建一个变量,然后返回引用(但是当你直接传递数组时,通过引用传递它有什么意义?我没有发现它有任何用处,或者我错过了什么?

function pass(&$arr)
{
  // do something
}


function &scopeVar($arr){
    return $arr;
}

pass(scopeVar([1, 2, 3]));

评论

0赞 rhavin 10/29/2021
你错过了可用性的易用性:[1,2,3] 是一个变量,它只是没有名称。在某些情况下,你事后需要它,在某些情况下,你只想开火并忘记。我一直在寻找一种简单的解决方案,我可以两者兼而有之。
0赞 pumpkinthehead 10/29/2021
手册中的参考文献可以让你深入了解为什么他们不允许你这样做:php.net/manual/en/language.references.whatare.php“PHP中的引用是一种通过不同名称访问相同变量内容的方法。如果未在调用范围内创建命名内存位置,则该函数无法访问相同的变量内容。这家伙解释得非常好:stackoverflow.com/questions/9848295/......
3赞 Jaquarh 10/29/2021
更重要的是,如何在内存中存储值,然后从内存中引用它?Dur,谁会想到 - 这就是为什么我们有变量,同样也是您可以通过引用传递的原因。这家伙很困惑,这个问题应该结束了。
0赞 anees 10/30/2021
@rhavin不会有更简单的解决方案......您可以在全局范围内创建该函数,并随时使用...(也适用于其他情况。
1赞 David Lee Crites 10/29/2021 #2

@rhaven;

我不知道你在这里试图做什么,但错误消息不仅正确,而且有意义。数组是动态创建的,虽然它实际上存在于内存中,但除了传递给函数的临时数组外,没有对它的引用。

试图引用这样的短暂值是矛盾的。这根本没有意义。

@anees提供了一个有趣的解决方法,但最重要的是,我认为您需要重新考虑代码,以及为什么您需要:

  1. 调用中的 temp 变量,或者
  2. 函数中的引用。
0赞 pumpkinthehead 10/29/2021 #3

函数调用中的 [1,2,3] 不是变量,它只是一个硬编码值。您可以将其传递给按值传递的函数,但不能通过引用传递。如果函数是通过引用传递的,则它需要一个变量。更重要的是,在 PHP 7 中,如果您尝试在方法调用中声明变量,他们会在严格的标准中添加一个通知,即: https://www.php.net/manual/en/migration70.incompatible.phppass(($a = [1,2,3]));

此页面没有给出该决定的原因。