Bitte um Hilfe bei Scriptbeispiel für Funktionen

PHPNOOB

Grünschnabel
Servus zusammen,

das folgende PHP Beispiel hat mir aufgezeigt das ich noch nicht verstanden habe wie die einzelnen Funktionen zu stande kommen, die jeweilige Ausgabe des echo:

var4: 10
var1: 20
var4: 30
var1: 20
var2: 20

Ich habe bereits viel Zeit damit verbacht Dokumentationen zu lesen und entsprechende TUTs anzusehen... jedoch kann ich dieses Script einfach nicht begreifen, ich hoffe jemand von euch kann es mir erklären, dankeschön.

PHP:
<?php
function eineFunktion(&$param)
{
$param = $param * 2;
}
function nochEineFunktion($param)
{
$param = $param / 2;
}

$var1 = 10;
$var2 = 20;
$var3 = 30;
$var4 = 0;
$var4 = &$var1;

echo "var4: $var4<br />"; // Ausgabe: 10

eineFunktion($var4);
echo "var1: $var1<br />"; // Ausgabe: 20
if ($var4 > $var2) {
$var4 = $var2;
}
else {
$var4 = &$var3;
}

nochEineFunktion($var4);
echo "var4: $var4<br />"; // Ausgabe: 30

eineFunktion($var3);
echo "var1: $var1<br />"; // Ausgabe: 20

echo "var2: $var2<br />"; // Ausgabe: 20
?>
 
Mit & erstellst du Referenzen. Dass heisst, beide Variablen sind gleich und bleiben gleich. Sie sind miteinander verbunden.
Ohne & wird der Wert der einen Variablen in die andere kopiert
PHP:
$a = 1;
$b = 2;

$a = $b;  //a=>2, b=>2
$a = 4;   //a=>4, b=>2
$a = &$b; //a=>2, b=>2
$a = 5;   //a=>5, b=>5

Das heisst, bei eineFunktion() wird die Variable die mitgegeben wird verändert.
Bei nochEineFunktion() wird zwar etwas gerechnet, $param aber nicht zurück gegeben. Auf gut deutsch, die Funktion macht in dem Fall zwar etwas, das hat aber auf die Aussenwelt der Funktion keinerlei einfluss.

$var4 verknüpfst du mit $var1. Wenn also $var4 verändert wird, verändert sich $var1 ebenfalls. Später verknüpfst du $var4 mit $var3. Somit ist die Verknüpfung zu $var1 aufgelöst.
 
PHP:
//$var4 wird mit $var1 verknüpft. Beide sind jetzt 10
$var4 = &$var1;
...
//Diese Funktion verändert $var1 und somit auch $var4
eineFunktion($var4);
...
//$var4 ist 20. Also gleich gross wie $var2
if ($var4 > $var2) {
   //kommt also nicht in diese Schleife, da 20 nicht grösser als 20 ist.
    $var4 = $var2;
}
else {
    //darum geht es hier weiter. Du verküpfst $var4 mit $var3. 
    //Ergo ist $var4 jetzt 30, $var1 bleibt auf 20 und ist nicht mehr mit $var4 verknüpft.
   $var4 = &$var3;
}

//Wie schon beschreiben, macht diese Funktion mit $var4 nix. Ergo bleibt $var4 30
nochEineFunktion($var4);
echo "var4: $var4<br />"; // Ausgabe: 30

//Diese Funktion verändert $var3 und somit $var4 zu 60 (30*2)
eineFunktion($var3);
//$var4 und $var3 interessieren dich aber nicht weiter, darum siehst du das Resultat auch nicht.
//$var1 ist von weiter oben noch auf 20
echo "var1: $var1<br />"; // Ausgabe: 20
//$var2 hast du nie benutzt. Also ist da noch der Originalwert
echo "var2: $var2<br />"; // Ausgabe: 20

Ich rate dir nicht mit & zu arbeiten wenn es nicht notwendig ist.
Schreibe die Funktionen mit einem Return-Wert. Es ist viel verständlicher. Dann änder sich IMMER nur die Variable vor dem Gleichheitszeichen
PHP:
function eineFunktion(&$param){
    return $param * 2;
}

$var4 = eineFunktion($var4);
 
PHP:
//$var4 wird mit $var1 verknüpft. Beide sind jetzt 10
$var4 = &$var1;
...
//Diese Funktion verändert $var1 und somit auch $var4
eineFunktion($var4);
...
//$var4 ist 20. Also gleich gross wie $var2
if ($var4 > $var2) {
   //kommt also nicht in diese Schleife, da 20 nicht grösser als 20 ist.
    $var4 = $var2;
}
else {
    //darum geht es hier weiter. Du verküpfst $var4 mit $var3.
    //Ergo ist $var4 jetzt 30, $var1 bleibt auf 20 und ist nicht mehr mit $var4 verknüpft.
   $var4 = &$var3;
}

//Wie schon beschreiben, macht diese Funktion mit $var4 nix. Ergo bleibt $var4 30
nochEineFunktion($var4);
echo "var4: $var4<br />"; // Ausgabe: 30

//Diese Funktion verändert $var3 und somit $var4 zu 60 (30*2)
eineFunktion($var3);
//$var4 und $var3 interessieren dich aber nicht weiter, darum siehst du das Resultat auch nicht.
//$var1 ist von weiter oben noch auf 20
echo "var1: $var1<br />"; // Ausgabe: 20
//$var2 hast du nie benutzt. Also ist da noch der Originalwert
echo "var2: $var2<br />"; // Ausgabe: 20

Ich rate dir nicht mit & zu arbeiten wenn es nicht notwendig ist.
Schreibe die Funktionen mit einem Return-Wert. Es ist viel verständlicher. Dann änder sich IMMER nur die Variable vor dem Gleichheitszeichen
PHP:
function eineFunktion(&$param){
    return $param * 2;
}

$var4 = eineFunktion($var4);



Vielen Dank für die Erklärung, ich denke ich brauche noch etwas Zeit bis ich es so gut erklären kann wie du aber das ist schon mal ein Anfang (y) DANKE!
 
Wie geschrieben. Verwende Referenzen( also das &) nur im Notfall. Das Leben wird gleich viel einfacher.
 

Neue Beiträge

Zurück