Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung
71 Unwetterwarnungen in Deutschland
Die Datenbank wurde zuletzt am 02.08.2020 17:34:28 aktualiesiert
71

Funktionsaufruf per Referenz

In den meisten PHP-Anwendung gibt es Funktionen (oder bei OOP Methoden). Diese können Parameter als Eingabewerte empfangen. Nun gibt es – wie in den meisten Programmiersprachen – in PHP den Aufruf per call-by-value und call-by-reference. Der Unterschied ist, dass bei call-by-value das zu übergebende Objekt ausgelesen und in eine neue (lokale) Variable gespeichert wird, mit der dann innerhalb der Funktion gearbeitet werden kann.
Bei call-by-reference wird nicht der Inhalt übergeben sondern lediglich ein Zeiger auf eine bestimmte Variable. Das spart jede Menge Speicherplatz, da die Daten nur einmal im Speicher sein müssen, während die gleichen Daten bei call-by-value sowohl in der übergebenen Variable als auch in der lokalen Variable in der Funktion stehen.Wirklich interessant ist das vor allem bei der Übergabe von Arrays und Objekten an eine Funktion, da diese recht speicherintensiv sind. Bei Zahlen und Strings braucht das hier gesagte eher weniger angewendet zu werden.
In PHP sehen die Varianten so aus:

 
 $numberArray = array(); 
for($i=0;$i<10000;$i++) { 
  $numberArray[] = $i; } 
  // Funktion, die per call-by-value aufgerufen wird 
function array_calc($arr) { 
  $cnt_arr = count($arr)-1; 
  for($i=$cnt_arr;$i>0;$i--) {  
   $arr[$i] = $arr[$i] * $arr[$i-1]; 
  }   
return $arr; }
  // call-by-value Aufruf 
$numberArray = array_calc($numberArray);
  // Funktion, die per call-by-reference aufgerufen wird 
function array_calc(&$arr) { 
  $cnt_arr = count($arr)-1; 
  for($i=$cnt_arr;$i>0;$i--) { 
    $arr[$i] = $arr[$i] * $arr[$i-1];  
 } }  
 // call-by-reference-Aufruf 
array_calc($numberArray); 
 

Der Unterschied ist das „&“ vor dem Parameternamen bei der Referenz-Variante. Außerdem wird bei dieser Variante kein Rückgabewert benötigt, da das übergebene Array direkt bearbeitet wird. Daran sieht man, dass, falls die Daten innerhalb der Funktion verändert werden, der Referenzaufruf nur dann SInn macht, wenn die ursprünglichen Daten des Arrays oder Objektes nicht mehr benötigt werden. Falls sie nur zum Auslesen benötigt werden, ist call-by-reference auf jeden Fall sinnvoll.

Die Auswertung
Für ein Array mit 10000 Einträgen wurde das ganze verglichen.

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
result_function_
call_by_reference.php
158.137390 s 15.814 ms 100 %
result_function_
call_by_value.php
174.120373 s 17.412 ms 110 % (+10 %)

Diese Scripte wurde lokal getestet, wo genug Speicher vorhanden ist und nicht gleichzeitig mehrere Besucher die gleiche Datei anfordern. Im Internet sollte sich die Schere zwischen Referenz- und Wert-Funktion noch vergrößern.
Deshalb empfehle ich, bei Funktionsaufrufen mit großen Objekten oder Arrays – wenn möglich – den Parameter per call-by-reference zu übergeben.