【问题标题】:PHP array copy semantics: what it does when members are references, and where is it documented?PHP数组复制语义:当成员是引用时它会做什么,它在哪里记录?
【发布时间】:2011-05-20 13:15:38
【问题描述】:

这段代码

<?php

$a = 10;
$arr1 = array(&$a);

$arr1[0] = 20;
echo $a; echo "\n";

$arr2 = $arr1;
$arr2[0] = 30;

echo $a;

生产

20
30

显然引用数组成员是“保留的”,这可能会导致一些有趣/奇怪的行为,例如

<?php

function f($arr) {
    $arr[0] = 20;
}

$val = 10;
$a = array(&$val);

f($a);

echo $a[0];

?>

输出

20

我的问题是:它有什么用,它在哪里记录(除了http://www.php.net/manual/en/language.types.array.php#50036 的用户评论)和 Zend 引擎源代码本身?

【问题讨论】:

    标签: php arrays reference copy


    【解决方案1】:

    PHP 的引用分配行为记录在manual page "PHP: What References Do" 上。您还可以在此处找到有关数组值引用的段落,开头为:

    虽然不是严格意义上的引用赋值,但使用语言构造 array() 创建的表达式也可以通过在要添加的数组元素前加上 & 来表现。

    该页面还解释了为什么您的第一个代码的行为如此:

    但是请注意,数组内部的引用具有潜在的危险。使用右侧的引用进行普通(非引用)赋值不会将左侧变为引用,但数组内的引用会保留在这些普通赋值中。这也适用于数组按值传递的函数调用。

    【讨论】:

    • 那也应该在array的页面上:)。
    • @mlvljr:如果您认为可以提交文档错误:bugs.php.net/report.php
    • @nikic 可能,无论如何,我已经在array 页面上留了个便条。
    猜你喜欢
    • 2019-12-23
    • 2022-10-01
    • 2015-12-31
    • 1970-01-01
    • 2016-03-28
    • 2011-11-25
    • 2013-07-22
    • 1970-01-01
    相关资源
    最近更新 更多