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";

?>

で 1 回、 で 1回実行ref()ret()ます。私の結果:

ref()

  • 8043280 (以前/現在)
  • 8044188 (前/ピーク)
  • 8043300 (後/現在)
  • 8044216 (後/ピーク)

ret()

  • 8043352 (以前/現在)
  • 8044260 (前/ピーク)
  • 8043328 (後/現在)
  • 12968632 (後/ピーク)

したがって、ご覧のとおり、PHP は関数内のデータを変更してそれを返すときに、より多くのメモリを使用します。したがって、最適なケースは参照渡しです。

ただし、参照渡しが行われていることが明らかでない場合、参照渡しは危険な場合があります。多くの場合、独自のデータを変更するクラスにデータをカプセル化することで、この問題を完全に回避できます。

オブジェクトを使用する場合、PHP5 は常にオブジェクトを参照渡しすることに注意してください。

于 2010-09-05T02:13:29.740 に答える
0

ほとんどの場合、呼び出し元が既に持っている参照を返すことは冗長です。これは、2 番目の例で発生することです。私が考えることができる唯一のケースは、メソッド呼び出しの連鎖です。

一般に、関数がそのパラメーターの状態を変更する場合は参照パラメーターを使用し、戻り値を使用して呼び出し元に何か新しいものを導入します。

于 2010-09-05T02:10:50.363 に答える