Werden alle Objekte und 'Unter-'objekte automatisch gelöscht ?

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

  • Werden alle Objekte und 'Unter-'objekte automatisch gelöscht ?

    Hallo Leute,

    da ich noch ziemlich neu bin bei PHP weis ich noch nicht genau wie das bei PHP funktioniert....

    soweit ich weis werden alle erstellten Objekte nach Scriptende automatisch gelöscht bzw. der Speicherplatz freigegeben.

    Was mich dabei aber stört ist:
    Ich habe in Beispielcodes schon einige male gesehen das unset($obj) benutzt wird.
    Ist das nur um sauberen Code zu haben oder muss man das vielleicht doch selber löschen wie in anderen Programmiersprachen auch ?

    Und was ist mit den Objekten die als Eigenschaft einer Klasse erstellt wurden, also Objekte in Objekte ? Diese werden sicherlich auch gleich mitgelöscht da ja die komplette Speicheradresse des Elternobjekts freigegeben wird.....

    Will nur nochmal sichergehen........

  • #2
    Re: Werden alle Objekte und 'Unter-'objekte automatisch gelöscht ?

    Original geschrieben von Master0Blicker


    soweit ich weis werden alle erstellten Objekte nach Scriptende automatisch gelöscht bzw. der Speicherplatz freigegeben.
    Genau genommen wird ein objekt zerstört wenn keine
    referenzen auf das objekt mehr existieren. Das ganze
    wird durch den GC gehandled.

    Original geschrieben von Master0Blicker
    Was mich dabei aber stört ist:
    Ich habe in Beispielcodes schon einige male gesehen das unset($obj) benutzt wird.
    Ist das nur um sauberen Code zu haben oder muss man das vielleicht doch selber löschen wie in anderen Programmiersprachen auch ?
    Kommt darauf an. Mit unset wird afair erstmal noch kein speicher
    frei gegeben. Das objekt wird nur als "tot" gekennzeichnet so
    dass der GC es aufräumen kann.
    unset() kann wichtig werden wenn du circuläre abhängigkeiten
    in klassemembern hast. Damit kann der gc afaik nicht umgehen.

    Bsp.:
    PHP-Code:
    class foo{
       private 
    $bar_;

       public function 
    __construct(){
            
    $this->bar_ = new bar($this);
       }
    }

    class 
    bar{
        private 
    $foo_ref_;

        public function 
    __construct($other=null){
              
    $this->foo_ref_ $other;
        }

    Solche constructe sind vom gc nicht zu handlen.
    Abhilfe schaft ein explizites unset() im dtor der bar-klasse.
    Es ist auch zu beachten dass sowohl ctor als auch dtor
    einer elternklasse nicht automatisch mit dem ctor u. dtor
    der abgeleiteten klasse aufgerufen werden.

    Original geschrieben von Master0Blicker
    Und was ist mit den Objekten die als Eigenschaft einer Klasse erstellt wurden, also Objekte in Objekte ? Diese werden sicherlich auch gleich mitgelöscht da ja die komplette Speicheradresse des Elternobjekts freigegeben wird.....
    Normalerweise ja, aber es gibt ausnahmen wie in meinem beispiel.


    greets
    (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

    Kommentar

    Lädt...
    X