Dez 19
Typen von Referenzen in PHP, Objekte löschen
Wieder was gelernt:
Es gibt in PHP zwei Typen von Objektreferenzen, auch wenn es keine Dokumentation dazu gibt (Wer eine findet bitte sagen..!).
Im Handbuch steht nur: Objekte werden immer als Referenz übergeben
Das stimmt natürlich, nur ist es nicht ganz so einfach. Das Problem fällt allerdings erst auf, wenn man Objekte kontrolliert zerstören will.
$obj = NULL; # (1)
Sollte ein Objekt zerstören, wie unset(). Doch was wenn man vorher
$obj2 = $obj;
gemacht hat? Plötzlich zerstört der erste Befehl (1) nichtmehr, er setzt nur die erste Variable auf NULL. Nun das selbe ein bischen verändert:
$obj2 = &$obj; # & für Referenz sollte eigentlich nicht nötig sein
(1) Führt nun dazu, dass beide Variablen NULL sind. Huch?
Diese Referenzen heißen entweder hard/soft oder echt/unecht, wie auch immer.
Dezember 21st, 2008 at 23:51
Ich versteh dein Beispiel nicht ganz.
$obj2 = $obj;
$obj = NULL;
Logisch $obj hat NULL, $obj2 hat das „objekt“.
Die 3. Zeile weiß ich nicht wirklich in den Quelltext einzuordnen. Kommt sie etwa nach den beiden oder nach (1)?
$obj = NULL;
$obj2 = &$obj;
Dies wäre nämlich genau so logisch, dass beide NULL enhalten.
$obj2 = $obj;
$obj = NULL;
$obj2 = &$obj;
Genau so wie dies; $obj2 wird am ende mit der Referenz von $obj überschrieben.
Bitte nochmal ausführlich erklären was du meinst!^^
Dezember 21st, 2008 at 23:55
$obj = new obj();
$obj2 = $obj;
$obj = NULL;
// $obj instanceof obj
—
$obj = new obj();
$obj2 = &$obj;
$obj = NULL;
// $obj2 == NULL
Klarer?
Dezember 30th, 2008 at 00:30
http://de.php.net/manual/de/language.oop5.basic.php
Beispiel #6 zeigt das auf. Könnte aber wirklich besser dokumentiert sein 😉
mfG Big Mäc
Januar 15th, 2009 at 11:15
Verstehe das Problem nicht ganz.
Das ist doch das erwartete Verhalten.
> $obj2 = &$obj; # & für Referenz sollte eigentlich nicht nötig sein
Warum sollte das nicht nötig sein?
Du meinst sicher, das $foo =& new obj; in PHP 5 nicht explizit nötig ist,
um es als Referenz zu instanzieren.
Ob $obj2 = $obj; oder $obj2 =& $obj; ist natürlich ein Unterschied.
Einmal wird das Objekt kopiert einmal eine Referenz erstellt.
Genau das Verhalten wie man es von variablen erwarten würde.
$foo = 1;
$foo2 = $foo;
$foo = NULL;
# NULL
# 1
$foo = 1;
$foo2 =& $foo;
$foo = NULL;
# NULL
# NULL
Januar 15th, 2009 at 19:55
>Einmal wird das Objekt kopiert einmal eine Referenz erstellt.
kopiert? Dafür gibt es „clone“
Du behandelst weiterhin eine Referenz des Objekts, nur dass du es nicht löschen kannst.