我以前见过这两个,据我所知,它几乎是主观的,但如果给出选项,你会做什么以及为什么?如果数据很大,那么其中一个数据会有任何速度/内存优势吗?
function processData(&$data_to_process) { // Pass by reference.
// do something to the data
}
// ... somewhere else
$this->processData($some_data);
或
function processData($data_to_process) { // Pass by value.
// do something to the data
return $data_to_process;
}
// ... somewhere else
$some_data = $this->processData($some_data);
答案 0 :(得分:5)
PHP写入时复制,因此如果数据在函数中没有变化,使用引用只会使事情运行得更慢。
在您的情况下,您正在更改数据,因此将进行复制。测试如下:
<?php
define('N', 100000);
$data = range(1, N);
srand(1);
function ref(&$data)
{
$data[rand(1, N)] = 1;
}
function ret($data)
{
$data[rand(1, N)] = 1;
return $data;
}
echo memory_get_usage()."\n";
echo memory_get_peak_usage()."\n";
ref($data);
// $data = ret($data);
echo memory_get_usage()."\n";
echo memory_get_peak_usage()."\n";
?>
使用ref()
运行一次,使用ret()
运行一次。我的结果:
因此,正如您所看到的,PHP在修改函数中的数据并返回时会占用更多内存。所以最好的情况是通过引用传递。
然而,如果不明显发生,那么通过引用传递可能是危险的。通常,您可以通过将数据封装在修改自己数据的类中来完全避免这个问题。
请注意,如果您使用对象,PHP5始终通过引用传递它们。
答案 1 :(得分:0)
在大多数情况下,返回调用者已有的引用是多余的,这是在第二个示例中发生的情况。我能想到的唯一有用的方法是链接方法调用。
通常,当函数更改该参数的状态时使用引用参数,并使用返回值向调用者引入新内容。