Frage

Ich habe beide gesehen, und soweit ich weiß, es ist ziemlich subjektiv, aber wenn die Möglichkeit gegeben, die Sie tun würden, und warum? Wenn die Daten groß waren, gäbe es jede Geschwindigkeit / Speicher Nutzen einer von ihnen?

function processData(&$data_to_process) { // Pass by reference.
    // do something to the data
}

// ... somewhere else

$this->processData($some_data);

oder

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);
War es hilfreich?

Lösung

PHP-Kopien auf Schreib, so dass, wenn die Daten in der Funktion nicht ändern, einen Verweis mit nur machen die Dinge laufen langsamer.

In Ihrem Fall Sie verändern die Daten, so dass eine Kopie auftreten. Test mit dem folgenden:

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

?>

Ausführen es einmal mit ref() und einmal mit ret(). Meine Ergebnisse:

ref ()

  • 8043280 (vor / Strom)
  • 8044188 (vor / peak)
  • 8043300 (nach / Strom)
  • 8044216 (nach / peak)

ret ()

  • 8043352 (vor / Strom)
  • 8044260 (vor / peak)
  • 8043328 (nach / Strom)
  • 12968632 (nach / peak)

So, wie Sie sehen können, verwendet PHP mehr Speicher, wenn die Daten in der Funktion ändern und es zurückkehrt. So ist der optimale Fall ist durch Verweis übergeben.

Allerdings kann vorbei Referenz gefährlich sein, wenn es nicht offensichtlich ist, dass es auftritt. Oft kann man diese Frage ganz vermeiden, indem Sie Ihre Daten in Klassen Einkapselung, die ihre eigenen Daten ändern.

Beachten Sie, dass, wenn Sie Objekte verwenden, PHP5 gibt sie immer Bezug genommen wird.

Andere Tipps

Es ist überflüssig, in den meisten Fällen einen Verweis zurück, dass der Anrufer bereits hat, das ist das, was in Ihrem zweiten Beispiel passiert. Der einzige Fall, dass ich denken kann, wo es sinnvoll ist, ist für die Verkettung Methodenaufrufe.

Im Allgemeinen einen Referenzparameter verwenden, wenn die Funktion den Zustand dieses Parameters ändern, und verwenden Sie den Rückgabewert, etwas Neues zu dem Anrufer einzuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top