我以前见过这两种情况,据我所知,它非常主观,但如果给你选择,你会选择哪种?为什么?如果数据很大,其中之一会有任何速度/内存优势吗?
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);
最佳答案
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()
运行一次。我的结果:
引用()
- 8043280(之前/现在)
- 8044188(前/峰)
- 8043300(之后/当前)
- 8044216(后/峰)
返回()
- 8043352(之前/现在)
- 8044260(前/峰)
- 8043328(之后/当前)
- 12968632(后/高峰)
因此,如您所见,PHP 在函数中修改数据并返回时使用了更多的内存。所以最佳情况是通过引用传递。
但是,如果按引用传递的发生并不明显,则它可能很危险。通常,您可以通过将数据封装在修改自身数据的类中来完全避免这个问题。
请注意,如果您使用对象,PHP5 总是通过引用传递它们。
关于php - 返回值还是修改引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3644701/