SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=151&group=27
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Was leisten Referenzen?


PHP-Referenzen erlauben es, zwei Variablennamen sich auf den gleichen Variableninhalt beziehen zu lassen.

Das heißt im folgenden Beispiel, dass sich $punkte und $punktestand auf dieselbe Variable beziehen:

<?php
$punkte = 1000;
$punktestand = &$punkte;

// Ausgabe (1000)
echo $punktestand;
?>

Achtung: $punkte und $punktestand sind hier gleichwertig, und $punkte ist nicht nur ein Zeiger auf $punktestand oder umgekehrt, sondern $punkte und $punktestand zeigen auf denselben Inhalt.


Seit PHP 4.0.4 kann & auch in Verbindung mit new verwendet werden.

<?php
class Haus
{
  var $etagen;
  function Haus($etagen)
  {
    $this->etagen = $etagen;
  }
}

$meinhaus = &new Haus(2);
$hausetagen = &$meinhaus->etagen;
// Ausgabe (2)
echo $hausetagen;
$hausetagen = 10;
// Ausgabe (10)
echo $meinhaus->etagen;
?>

Wenn der &-Operator nicht verwendet wird, erzeugt PHP eine Kopie des Objekts. Wenn nun $this innerhalb der Klasse verwendet wird, bezieht es sich auf die aktuelle Instanz der Klasse. Die Zuordnung ohne & erzeugt eine Kopie der Instanz (d. h. des Objekts) und $this wird sich auf die Kopie beziehen. In der Regel will man aus Performance- und Speichergründen nur eine einzige Instanz einer Klasse erzeugen.

pass-by-reference


Eine weitere Einsatzmöglichkeit von Referenzen ist die Übergabe von Parametern an eine Funktion mit pass-by-reference. Hierbei beziehen sich der lokale Variablenname und der Variablenname der aufrufenden Instanz auf denselben Variableninhalt:

<?php
function ausgabe(&$var) {
  return $var++;
}

$zahl=5;
// Ausgabe (5)
echo ausgabe ($zahl);
// Ausgabe (6)
echo $zahl;
?>


return-by-reference

Daneben besteht die Möglichkeit, aus Funktionen heraus Werte mit return-by-reference zurückzugeben. Das Zurückgeben von Ergebnissen per Referenz aus Funktionen heraus kann in manchen Fällen recht nützlich sein. Hierbei ist folgende Syntax zu beachten:
<?php
function &ausgabe($param) {
  return $param;
}

$wert =&ausgabe(5);
// Ausgabe (5)
echo $wert;
?>

In diesem Beispiel wird also die Eigenschaft des von ausgabe() gelieferten Werts gesetzt, nicht die der Kopie, wie es der Fall wäre, wenn die Funktion ausgabe() ihr Ergebnis nicht per Referenz liefern würde.

Achtung: Im Gegensatz zur Parameterübergabe per Referenz ist bei der Rückgabe mittels Referenz an beiden Stellen die Angabe des & notwendig.