PHP函数数组_replace(),为什么参数通过引用传递?

PHP函数数组_replace(),为什么参数通过引用传递?,php,arrays,php-5.3,Php,Arrays,Php 5.3,PHP.net上array_replace()的函数签名表示数组将通过引用传入。这样做的原因/好处是什么,而不是按值,因为要获得预期的结果,必须将完成的数组返回给变量。我可以在手册中重现结果,所以这不是如何使用此功能的问题 下面是函数签名和一个示例,都来自php.net 资料来源: 功能签名: array array_replace ( array &$array , array &$array1 [, array &$... ] ) 示例代码: $base = arr

PHP.net上array_replace()的函数签名表示数组将通过引用传入。这样做的原因/好处是什么,而不是按值,因为要获得预期的结果,必须将完成的数组返回给变量。我可以在手册中重现结果,所以这不是如何使用此功能的问题

下面是函数签名和一个示例,都来自php.net

资料来源:

功能签名:

array array_replace ( array &$array , array &$array1 [, array &$... ] )
示例代码:

$base = array("orange", "banana", "apple", "raspberry");
$replacements = array(0 => "pineapple", 4 => "cherry");
$replacements2 = array(0 => "grape");

$basket = array_replace($base, $replacements, $replacements2);
print_r($basket);
上述示例将输出:

Array
(
    [0] => grape
    [1] => banana
    [2] => apple
    [3] => raspberry
    [4] => cherry
)
which调用which调用which调用which调用which调用which调用which调用which调用which调用etc.etc.etc.etc.etc.导致一个底层调用,这可能是数组通过引用传递到PHP的
array\u replace()
的最终原因(因为
memcmp()
需要它们)

数组是PHP的一个方面,它似乎可以工作,很少受到质疑,在做了一点挖掘之后,我可以看出为什么。

好吧,关键是函数不仅被使用,而且被
+
使用(当它的两个操作数都是数组时)

虽然在处理上存在一些差异,但实际上没有一个可以归因于需求的差异:据我所知,没有人将
+
写成
&$arr+&$arr
,这毫无意义

所以我想这只是文档中的一个错误

但是,不必分析PHP内部代码的深渊,就可以得出这个结论。)请记住,当我们传递一个可以(并且很可能会)更改的数组时,我们使用
&$array
表示法-例如,请参见签名。而且(这很容易检查)
array\u replace
不会更改其参数-至少目前是这样。)

更新:好吧,现在我很生气。如果一些PHP开发人员(上帝保佑他的灵魂)真的认为这不是文档中的bug,让他/她解释一下原因:

array_pop(array('a' => 1));
。。。触发致命错误(
只能通过引用传递变量),并且此

array_replace(array('a' => 1), array('b' => 2));
。。。会起作用的,因为什么都没发生

或者我们现在在PHP中有两种类型的引用吗

假设: 由于通过值传递涉及到复制数组,我想通过引用传递它们会更快

测试它: 结论:
显然,这不是出于性能原因。

这是一个文档错误,现在已经修复


原因很简单::)@biziclop那篇文章是一篇长篇大论。他非常坦率地表示不喜欢PHP,所以这篇文章当然对它有负面的偏见。但这并不意味着他是100%正确的。顺便说一句,
array\u replace
的文档页面最近已经更新了,我们所说的错误现在已经消失了。所以我想我们终究可以让这个世界变得更好。)您的意思可能是将
放入PHP的数组中_replace()by reference
-正式无引用。)@克朗塔布:谢谢你的回答。我现在明白了。人们之所以对此表示支持,是因为他们熟悉php的内部工作,所以你同意整个memcmp吗?我不相信…@rambocoder你看过代码链接了吗?他们直接进入PHP的源代码(memcmp()链接进入GNU的libc手册),我不确定还有什么其他参考更具权威性…@rambocoder PHP源代码中很少有注释解释他们为什么选择这样做。我认为我不应该因为没有打电话给Rasmus并要求他解释自己而被否决。我认为这也是一个bug,所以我提交了一个bug,我从某人那里得到了一个回复,这不是bug,因为函数按照文档中的描述工作。但它也在文档中说“您可以通过引用将变量传递给函数,以便函数可以修改变量”。更新了答案。令人惊讶的是:每次我认为PHP支持社区不会再让我惊讶了,它只是设法做到了。PHP并不总是抱怨这一点。eg
current(数组(1))但是…我认为()只是被错误地记录为需要引用。请尝试调用
ref(array('a'=>1))
val(array('a'=>1))
。看到小的
&
符号造成的差异了吗?)@raina77ow-实际上,通过引用传递似乎比较慢(看看测试结果),所以整个
是为了性能
的想法无论如何都是错误的。
<?php 

function ref(array &$array) {
    for($i = 0; $i < count($array); $i++) {
        $array[$i] == 'foo'; //just accessing
    }
}

function val(array $array) {
    for($i = 0; $i < count($array); $i++) {
        $array[$i] == 'foo'; //just accessing
    }
}


//create large array
$array = array();
for($i = 0; $i < 100; $i++) {
    $array[] = $i;
}


echo "Pass by reference\n";
$t1 = microtime(true);
for($i = 0; $i < 10000; $i++) {
    ref($array);
}
$t2 = microtime(true);
echo $t2 - $t1 . "s\n\n";

echo "Pass by value\n";
$t1 = microtime(true);
for($i = 0; $i < 10000; $i++) {
    val($array);
}
$t2 = microtime(true);
echo $t2 - $t1 . "s\n\n";
Pass by reference
8.3282010555267s

Pass by value
1.4845979213715s