PHP数组的一个元素是通过引用,另一个是通过值传递两个元素数组作为值参数时?



有人能解释一下我在PHP 8.1.6中看到的这种奇怪的行为吗?

我想这些行为是符合标准的,我只是不明白。函数调用有一个按值形参,但调用后数组被改变,这都是因为引用了第一个元素。
$arr = [3, 4];
$ref = &$arr[0] ;             // this statement causes the weird behaviour. Without it all is ok
print_r($arr);                // as expected
print_r(doSomethingTo($arr)); // as expected
print_r($arr);                // WHAT JUST HAPPENED?
function doSomethingTo($arr) {
// $arr BY VALUE
foreach($arr as $k => $v)
$arr[$k]=$v+1 ;
return $arr ;
}

结果:

Array
(
[0] => 3
[1] => 4
)
Array
(
[0] => 4
[1] => 5
)
Array
(
[0] => 4
[1] => 4
)

为什么?为什么对第一个数组元素的引用改变了通过值参数传递的行为?第一个元素现在通过引用传递给函数,第二个元素通过值传递!???

谢谢你的解释!

我在https://www.php.net/manual/en/language.references.whatdo.php找到了一个有点复杂的公式答案

我将把答案翻译成这个特定的情况。

许多人可能没有意识到的是,$a =& $b并不意味着$a现在引用了$b,而是$a和$b都引用了原来包含在$b中的相同的

所以当计算$ref = &$arr[0] ;时,$arr[0]元素和$ref都变成对3值的引用。

现在,当数组作为参数值传递时,数组总是重复的。这里也是一样。

这意味着$arr[0]引用也被复制,即在重复的数组中,另一个引用被创建为相同的3值。我们有$ref,原来的$arr[0]函数中的$arr[0]所有都是对3值的引用。

当这三个引用中的任何一个被赋值时,值当然会改变。

谢谢你@Sammitch让我走上了正确的道路!