Dez 19

Typen von Referenzen in PHP, Objekte löschen

Tag: Allgemein,EntwicklungPhoscur @ 14:59

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.

5 Kommentare zu “Typen von Referenzen in PHP, Objekte löschen”

  1. - schrieb:

    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!^^

  2. Phoscur schrieb:

    $obj = new obj();
    $obj2 = $obj;
    $obj = NULL;
    // $obj instanceof obj

    $obj = new obj();
    $obj2 = &$obj;
    $obj = NULL;
    // $obj2 == NULL
    Klarer?

  3. Big Mäc schrieb:

    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

  4. tester schrieb:

    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

  5. Phoscur schrieb:

    >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.

Dein Kommentar

Du musst eingelogt sein, um einen Kommentar zu schreiben.