Verhalten bei Parameter-Übergabe

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.