Referenz

Aus php bar
Wechseln zu: Navigation, Suche

Eine Referenz ist ein Verweis auf die Speicherstelle der Variable. Eine Variable beinhaltet nicht den Inhalt selber, sondern repräsentiert die Speicherstelle, bei der der entsprechende Inhalt zu finden ist. Der Compiler von PHP führt diese Beziehung zurück und gibt automatisch den Inhalt anstelle der Referenz zurück. "Referenz" bedeutet nun, dass die automatische Ersetzung ausgelassen wird und stattdessen die direkte Speicherstelle zurückgegeben wird.

Referenzen dienen dazu eindeutige und mehrfache identische Variablen manipulierbar zu machen. Speziell ist dies interessant bei Funktions- und Methodenaufrufen, bei denen der übergebene Wert manipuliert werden darf, aber nicht speziell den Rückgabewert darstellt.

Eine Referenz wird durch den &-Operator erzeugt. Dies geschieht in Kombination mit dem Zuweisungsoperator "=&" oder bei Variablen oder Eigenschaften (von Klassen/Objekten) nur durch den Operator "&".

In beiden Fällen zeigen nun zwei Referenzen auf den selben Speicherinhalt. Eine Änderung des Einen wirkt sich automatisch auch auf den zweiten aus.

 // speichert die Zeichenkette 'inhalt'
 // und legt unter dem $variable eine Referenz
 // auf den Inhalt diese Zeichenkette
 'inhalt';
 
 // kopiert den Inhalt der Variable
 // und legt eine Referenz auf den neuen Inhalt
 // der Inhalt ist nun der GLEICHE
 // legt eine neue Referenz auf den
10 // selben Inhalt wie bereits in $variable an
11 // der Inhalt ist nun der SELBE
12 // Oder
13 


Seit PHP5 werden Objekte durch den regulären Zuweisungsoperator "=" grundsätzlich referenziert.

 // erzeugt das neue Objekt
 // und erzeugt eine Referenz $objekt auf das Objekt
 // PHP 4:
 // legt eine neue Referenz auf den
 // selben Inhalt wie bereits in $objekt an
 // der Inhalt ist nun der SELBE
 $referenz = $objekt;
 // PHP 4: 
 $referenz =& $objekt;
10 
11 // kopiert den Inhalt der Variable
12 // und legt eine Referenz auf den neuen Inhalt
13 // der Inhalt ist nun der GLEICHE
14 // PHP 4: 
15 


Streng genommen sind eigentlich alle Variablen-Namen und Objekt-Namen Referenzen. Sie zeigen alle nur, wo sich der eigentliche Inhalt befindet. Allerdings wird beim Kopieren erst der Inhalt kopiert und dann eine neue Referenz auf den neuen Inhalt angelegt. Wer halbwegs bis hierher folgen konnte, wird nun auch verstehen, warum es sinnvoll ist, mit Referenzen zu arbeiten: Geschwindigkeit und Speicherverbrauch. Dies ist auch der Grund, warum sich die PHP-Entwickler mit der Version 5 dazu entschieden haben, Objekte nur noch als Referenz zu verwenden und dass nur mittels des Schlüsselwortes clone explizit eine Kopie eines Objektes angelegt werden kann. Ein anderer Grund ist, dass im Falle einer Übergabe eines Objektes im Regelfall die Referenz gewünscht wird. Sollte das konkrete Objekt nicht gewünscht werden, ist es oft einfacher die Klasse neu zu instanzieren.

Der eigentliche Inhalt dieser Variablen/Objekte wird erst aus dem Speicher geleert, wenn wirklich alle Referenzen auf diese Variable/Objekt gelöscht wurden. D. h., ein unset() löscht nicht den Inhalt sondern lediglich die Referenz. Das selbe gilt, wenn man einer Referenz mittels & Operator einen neuen Inhalt zuweist. Hier wird nicht der alte Inhalt überschrieben, sondern einfach die Zuweisung geändert.

 $hintergrund = 'Wei''Schwarz';
 
 // Hintergrundfarbe zuweisen
 'Hintergrundfarbe : ''Vordergrundfarbe : ''gewhlte Farbe   : ' . $farbe;
 
 // Vordergrundfarbe zuweisen
 'Hintergrundfarbe : ''Vordergrundfarbe : ''gewhlte Farbe   : ' . $farbe;
 
 // Vordergrundfarbe überschreiben
10 $farbe = 'Blau''Hintergrundfarbe : ''Vordergrundfarbe : ''gewhlte Farbe   : ' . $farbe;


Hintergrundfarbe : Weiß
Vordergrundfarbe : Schwarz
gewählte Farbe   : Weiß

Hintergrundfarbe : Weiß
Vordergrundfarbe : Schwarz
gewählte Farbe   : Schwarz

Hintergrundfarbe : Weiß
Vordergrundfarbe : Blau
gewählte Farbe   : Blau

Das Schlüsselwort global legt ebenfalls lediglich eine Referenz im aktuellen Geltungsbereich (scope) auf eine Variable außerhalb des aktuellen Geltungsbereichs an.

1 span class="st0">'inhalt'// erzeuge Referenz auf $variable aus main()
2 'neuer inhalt'
inhalt
neuer inhalt


Siehe auch: call_by_reference


ToDo: Dieser Artikel muss an dieser Stelle mit Folgendem ergänzt werden:call_by_reference, return_by_refernce