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