4

我以前都见过,据我所知,这非常主观,但如果可以选择,你会做什么,为什么?如果数据很大,其中一个对速度/内存有什么好处吗?

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);
4

2 回答 2

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()。我的结果:

参考()

  • 8043280(之前/现在)
  • 8044188(前/高峰)
  • 8043300(后/当前)
  • 8044216(后/峰)

ret()

  • 8043352(之前/现在)
  • 8044260(前/高峰)
  • 8043328(后/当前)
  • 12968632(后/高峰)

因此,如您所见,PHP 在修改函数中的数据并返回时使用了更多内存。所以最佳情况是通过引用传递。

但是,如果不明显,通过引用传递可能会很危险。通常,您可以通过将数据封装在修改自己数据的类中来完全避免这个问题。

请注意,如果您使用对象,PHP5 总是通过引用传递它们。

于 2010-09-05T02:13:29.740 回答
0

在大多数情况下,返回调用者已经拥有的引用是多余的,这就是您的第二个示例中发生的情况。我能想到的唯一有用的情况是链接方法调用。

通常,当函数将更改该参数的状态时使用引用参数,并使用返回值向调用者引入新的东西。

于 2010-09-05T02:10:50.363 回答