Jörg Peschke: Unterschied call by value vs. call by reference

Beitrag lesen

Moin,
Ich muss gesetehen, ich kenne mich mit dem PHP-CBR nicht so aus (wusste gar nicht, dass das geht :) ) - aber generell kann ich vielleicht trotzdem was dazu sagen:

  1. Kann man call by reference

function foo(&$var) {
...
}

foo($var);

prinzipiell der Übersichtlichkeit/ Sicherheit wegen durch

function foo($var) {
...
return $var;
}

$var = foo($var);

ersetzen?

Ja, können theoretisch schon. Das Problem ist eher, was du tust, wenn du mehrere Variablen in einer Funktion mainpulieren willst, z.b.

function foo ($a, $b, $c) {
   // Tue irgendwas, veränderte $a, $b, $c

return (Ja, was nun?)
}

Du könntest in diesem Fall ($a, $b und $c) in ein Array packen, dies zurückgeben, dann wieder aufdröseln und den ursprünglichen $a, $b, $c zuweisen - ein bisschen umständlich. Ausserdem: Vielleicht willst du auch noch so etwas wie einen Status zurückgeben, wo soll der dann hin, auch ins Array?

Mit CBR geht das dann hingegen recht "elegant":

function foo (&$a, &$b, &$c) {
   //Tue irgendwas

$completed = true;
   return($completed);
}

if (foo ($a, $b, $c)) {
   echo "Everything's fine";
}
else {
   echo "Wohoo, something bad happened";
}

  1. Ist call by reference (bemerkbar) schneller? V. a. bei Übergaben, die sehr viel Inhalt haben.

Ich würde schätzen nicht messbar schneller. Allerdings:
Jeder Funktionsaufruf mit CBV legt eine Kopie der übergebenen Variable auf den Stack, die erst wieder gelöscht wird, wenn die Funktion verlassen wird.

-> Gerade bei Mehrfach-Rekursion erhöht sich durch CBV der Speicherbedarf enorm.

  1. In welchen Situationen ist call by reference sinnvoll anzuwenden?

Generell immer dann, wenn Du nicht auf Kopien von Variablen sondern auf den Variablen selbst arbeiten willst, sprich, wenn du die Variablen selbst verändern möchtest, und sie nach dem Funktionsaufruf auch verändert bleiben sollen.

Der Klassiker: Vertauschen zweier Variablen:

// Funktioniert nicht (logisch, oder)?
function cbv_swap($a, $b) {
  $c = $b;
  $b = $a;
  $a = $c;

// Ab hier wird die Kopie von $a und $b wieder gelöscht, nichts
  // hat sich also an den ursprünglichen Variablen geändert
}

cbv_swap ($a, $b);

function cbv_swap(&$a, &$b) {
  $c = $b;
  $b = $a;
  $a = $c;

// Das geht, a und b sind jetzt vertauscht
}

  1. Wann ist ein per Aufruf gesetzter call by reference

function foo($var) {
...
(return $var !?)
}

foo(&$var);

Hier muss ich auf Grund mangelnder PHP Kenntnis passen, aber ich schätze, wenn du eine Funktion bauen willst, die sowohl mit Referenzen als auch mit normalen Variablen umgehen kann, kann so etwas hilfreich sein.

Viele Grüße,
Jörg