Bei der Übergabe von Parametern an eine Funktion muss man sich noch die Frage stellen: Was passiert, falls ich in der Funktion einen der Parameter verändere? PHP bietet hier mehrere Möglichkeiten an:
Call-by-value:
Übergabe der Parameter als Kopie (call-by-value), eine Veränderung der Kopien hat keine Rückwirkung auf das Original: Diese Methode wird angewendet, falls man nur Werte in die Funktion hineinliefern möchte, denn ein möglicher Fehler in der Funktion hat keinen Fehler im aufrufenden Hauptprogramm zur Folge. Sie wurde bei den bisherigen Programmen angewendet.
Call-by-reference (Festlegung bei Definition der Funktion):
Übergabe der Parameter als Verweis (call-by-reference) auf das Original, eine Veränderung hat Rückwirkung auf das Original: Diese Methode wird angewendet, wenn mehr als ein Wert aus einer Funktion zurückgeliefert werden soll. Über einen Rückgabewert könnte nur ein einziger Wert zurückgeliefert werden.
Call-by-reference (Option beim Aufruf der Funktion):
Übergabe von Verweisen auf die Original-Parameter (ebenfalls: call-by-reference), eine Veränderung hat Rückwirkung auf das Original: Möchte man die Änderungsmöglichkeiten der zweiten Methode mit der Sicherheit der ersten Methode verbinden, so kann man diese Vorgehensweise anwenden. Dabei kann der Entwickler von Fall zu Fall entscheiden, ob er beim Aufruf einer Funktion den Wert oder einen Verweis übergibt.
Alle drei Methoden sollen zum Vergleich an einem Beispiel dargestellt werden. Den beiden Funktionen rtauschen() bzw. vtauschen() werden zwei Parameter übergeben. Innerhalb der Funktionen sollen die beiden übergebenen Parameter miteinander vertauscht werden. In Abhängigkeit der verschiedenen angewendeten Methoden wird dieses Tauschen Rückwirkungen auf die Original-Variablen im Hauptprogramm haben. Die Werte werden jeweils vor und nach dem Tauschen angezeigt.
Ein Beispiel für alle drei Möglichkeiten (Datei uc29.php):
<html>
<head>
<?php
function
vtauschen($a, $b)
{
$temp = $a;
$a = $b;
$b =
$temp;
}
function rtauschen(&$a, &$b)
{
$temp =
$a;
$a = $b;
$b = $temp;
}
?>
</head>
<body>
<?php
//
Fall 1
$x = 12; $y = 18;
echo "Methode 1, vorher: $x, $y
<p>";
vtauschen($x,$y);
echo "Methode 1,
nachher: $x, $y <p>";
// Fall 2
$x
= 12; $y = 18;
echo "Methode 2, vorher: $x, $y
<p>";
rtauschen($x,$y);
echo "Methode 2,
nachher: $x, $y <p>";
// Fall 3
$x
= 12; $y = 18;
echo "Methode 3, vorher: $x, $y
<p>";
vtauschen(&$x,&$y);
echo "Methode
3, nachher: $x, $y <p>";
?>
</body>
</html>
Fall
1:
Der Wert der Variablen $x wird bei Aufruf der Funktion
vtauschen() an die Variable $a übergeben. Der Wert der Variablen
$y wird an die Variable $b übergeben. Innerhalb der Funktion
vtauschen() werden $a und $b getauscht. Da aber nur die Kopien
getauscht wurden, hat dies auf die Originale $x und $y keine
Auswirkungen.
Fall
2:
Den Unterschied sieht man im Funktionskopf function
rtauschen(&$a, &$b). Die Variable $x wird bei Aufruf der
Funktion rtauschen() per Verweis (Zeichen &) an die Variable $a
übergeben. Die Variable $y wird per Verweis an die Variable $b
übergeben. Innerhalb der Funktion werden $a und $b vertauscht.
Dadurch werden auch die Originale $x und $y vertauscht.
Fall
3:
Den Unterschied sieht man beim Aufruf der Funktion:
vtauschen (&$x, &$y); Die Variable $x wird beim Aufruf der
Funktion vtauschen() per Verweis (Zeichen &) an die Variable $a
übergeben. Die Variable $y wird beim Aufruf per Verweis an die
Variable $b übergeben. Innerhalb der Funktion werden $a und $b
vertauscht. Dadurch werden auch die Originale $x und $y vertauscht.