说这是代码:
function bar() {
$result = array();
for ($i = 0; $i < 1000; $i++) {
$result[] = $i * 10;
}
return $result;
}
$ha = bar();
print_r($ha);
返回像这样的大型数组是否效率低,因为它是“按值返回”? (如果它不是1000而是1000000)。因此,要改进它,我们是否会将第一行更改为:
function &bar() {
也就是说,只需在函数名前加一个&
- 如果返回一个大数组,这是正确的首选方法吗?
答案 0 :(得分:7)
关于PHP如何处理变量存储存在很多误解。由于PHP是“写入时复制”,因此无需创建“引用”(实际上是符号表别名)以节省空间或时间。事实上,这样做会伤害你。如果要将其用作某个别名的别名,则应该仅在PHP中创建引用。我运行了两个片段,看起来第二个实际上使用了更多内存(虽然不是很多)。
顺便说一下,1000个整数的数组很小。
答案 1 :(得分:5)
由于COW
,他们消耗绝对相同的内存量PS:要通过引用传递“true”,您还需要在赋值中添加它:
$ha =& bar();
答案 2 :(得分:3)
如果你在函数和外部输入memory_get_peak_usage()
,你会发现返回数组不会增加内存。
写入时的PHP副本。在这种情况下,即使您执行写操作也无需复制,因为原始变量超出了范围。所以不,没有理由这样做。
事实上,在PHP中,除非你需要它们提供的功能,否则通常没有理由使用引用:改变原始变量。
答案 3 :(得分:1)
官方手册页说:如果要使用函数查找引用应绑定到哪个变量,则按引用返回非常有用。不要使用按引用返回来提高性能。引擎将自动对其进行自动优化。只有在有正当技术理由的情况下才能返回引用
http://it2.php.net/manual/en/language.references.return.php
因此,在您的情况下,请不要使用它。
答案 4 :(得分:0)
这个怎么样?
function bar($result) {
$result = array();
for ($i = 0; $i < 1000; $i++) {
$result[] = $i * 10;
}
}
bar(&$ha);
print_r($ha);