Ankündigung

Einklappen
Keine Ankündigung bisher.

Objekte zerstören

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Objekte zerstören

    es mag sich jetzt doof anhören, aber ich lerne vom lesen und hab keine ahnung von oop an sich und es wird nirgendwo detailiert beschrieben, also hier:

    wenn ich ein objekt instanziere z.b.
    PHP-Code:
    $instanz = new Objekt(); 
    und ich rufe
    PHP-Code:
    $instanz->__destruct(); 
    auf, ist die instanz danach aus dem speicher gelöscht ??


  • #2
    Nein. PHP hat eine automatische Speicherverwaltung.
    Objekte (und Zeichenketten und Resourcen) haben einen Referenzzähler.
    PHP-Code:
    $x = new StdClass// Referenzzähler des Objekts 1
    $y $x // Referenzzähler des Objekts 2
    unset($x// Referenzzähler des Objekts 1
    $y=null // Referenzzähler des Objekts 0 
    Referenzzähler=0 bedeutet, dass das Objekt nicht mehr erreichbar ist und der garbage collector das Objekt abräumen kann. Und dann wird __destruct() aufgerufen, vom GC.

    Kommentar


    • #3
      das war schonmal sehr hilfreich, danke.
      und jetzt nochmal ins detail:
      wie genau ist das, wenn ich
      PHP-Code:
      $x = new StdClass;
      $y = new StdClass;
      unset(
      $x);
      $y=null
      mach und in StdClass irgendwo eigenschaften drinstehen die in $x und $y unterschiedlich sind?
      -wie kann ich den speicher dann freigeben?? -einfach mit unset() ??
      und: wird dabei dann der destruktor ausgeführt??
      oder greift der garbage collector erst, wenn KEIN objekt der klasse mehr existiert??

      Kommentar


      • #4
        PHP-Code:
        $x = new StdClass// erzeugt Objekt(1) mit Referenzzähler=1
        $y = new StdClass// erzeugt Objekt(2) mit Referenzzähler=1
        unset($y); // setzt bei Objekt(2) den Referenzzähler=0
        /* Objekt(2) kann vom GC abgebaut werden.
        __destruct() wird aufgerufen mit $this==Objekt(2) */
        $x='irgendwas anderes'// setzt bei Objekt(1) den Referenzzähler=0
        /* Objekt(1) kann vom GC abgebaut werden.
        __destruct() wird aufgerufen mit $this==Objekt(1) */ 

        Kommentar


        • #5
          also wird __destruct() immer ausgeführt, wenn die einzelne instanz gekillt wird; verstehe.

          danke dir vielmals, hat mir sehr geholfen

          Kommentar

          Lädt...
          X