destrutor problem

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

  • fireweasel
    antwortet
    Zitat von wahsaga Beitrag anzeigen
    ... Wann wirklich alle Referenzen auf ein Objekt entfernt sind, weiß man u.U. nicht immer exakt; ...
    Abgesehen von "cyclic references" sollte das aber möglich sein. Wenn nicht, ist irgendwas am Code unsauber.

    ... was “explicitly destroyed” bedeutet, kann ich gerade auch nicht sagen; ...
    Jetzt enttäuschst du mich aber:

    $object = null;

    ... und
    in der Shutdown-Phase kann man sich nicht mehr auf irgendeine bestimmte Reihenfolge verlassen.

    Späße wie

    Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error.
    kommen dann ggf. noch hinzu, um das ganze noch ein bisschen „spannender“ zu machen.
    Naja, anscheinend wieder so ein Fall, wo die PHP-Entwickler ein Feature eingebaut haben ohne sich über alle Konsequenzen klarzuwerden. Ist nichts neues.

    In der Theorie bzw. in anderen Sprachen wie bspw. JAVA ja - ...
    Das letzte mal, als ich mich mit Java beschäftigte, gabs da (noch) keine Destruktoren[0] ...

    ... und ich komme aus einer Welt, in der die wichtigste Grundregel lautet: Gib belegte Ressourcen wieder frei, weil in einem Multitaskingsystem andere Tasks (Prozesse) sie benötigen könnten. Ähnlich wie in dem Spruch:

    Verlassen Sie diesen Raum so, wie Sie ihn vorzufinden wünschen.

    ... - aber in PHP wäre ich mit letzterem auch vorsichtig, Reihenfolge und so. ...
    Mit Umkehrfunktionalität meinte ich nicht die Reihenfolge, sondern bspw. fclose() im Destruktor, wenn fopen() im Konstruktor stand.

    ...
    So lange sich keine explizite Notwendigkeit ergibt, einen Destruktor zu nutzen, ist man m.E. immer noch am besten bedient, wenn man am Scriptende einfach dem GC das Aufräumen überlässt und da nicht mit den eigenen Wurstfingerchen drin herum fuhrwerkt ;-)
    Wenn man nichts freigeben möchte, braucht man auch keinen Destruktor, klar. Dem GC das Aufräumen des Hauptspeichers zu überlassen, ist was anderes. Wie schon erwähnt, die Speicher-Freigabe kann man nicht (vernünftig) steuern.

    --
    [0] drin before finalize()
    Zuletzt geändert von fireweasel; 05.09.2011, 21:35.

    Einen Kommentar schreiben:


  • wahsaga
    antwortet
    Zitat von fireweasel Beitrag anzeigen
    Bisher bin ich davon ausgegangen, dass Objekt-Destrukturen bei bestimmten Ereignissen aufgerufen werden, wie Script-Ende, Objekt-Zerstörung per unset() oder = NULL usw.
    Das ist es ja auch im großen und ganzen ja auch schon.

    PHP: Constructors and Destructors:
    The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence.
    Wann wirklich alle Referenzen auf ein Objekt entfernt sind, weiß man u.U. nicht immer exakt;
    was “explicitly destroyed” bedeutet, kann ich gerade auch nicht sagen; und
    in der Shutdown-Phase kann man sich nicht mehr auf irgendeine bestimmte Reihenfolge verlassen.

    Späße wie
    Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error.
    kommen dann ggf. noch hinzu, um das ganze noch ein bisschen „spannender“ zu machen.

    In den Destruktor gehört prinzipiell die "Umkehrfunktionalität" des Konstruktors, sprich: Freigabe von belegten Ressourcen, Aufruf der Destruktoren von Unterobjekten usw.
    In der Theorie bzw. in anderen Sprachen wie bspw. JAVA ja - aber in PHP wäre ich mit letzterem auch vorsichtig, Reihenfolge und so.
    So lange sich keine explizite Notwendigkeit ergibt, einen Destruktor zu nutzen, ist man m.E. immer noch am besten bedient, wenn man am Scriptende einfach dem GC das Aufräumen überlässt und da nicht mit den eigenen Wurstfingerchen drin herum fuhrwerkt ;-)

    Einen Kommentar schreiben:


  • fireweasel
    antwortet
    Zitat von h3ll Beitrag anzeigen
    Du kannst nicht steuern, wann der Destruktor aufgerufen wird. Das macht der Garbage Collector von PHP.
    Kann man das irgendwo nachlesen? Bisher bin ich davon ausgegangen, dass Objekt-Destrukturen bei bestimmten Ereignissen aufgerufen werden, wie Script-Ende, Objekt-Zerstörung per unset() oder = NULL usw. Etwas anderes ist die Freigabe des belegten Speichers. Die kann man nicht steuern.

    *einschieb*
    Wollte gerade noch den Handbuchlink + Zitat nachschieben, aber da war ja wer schneller.

    Wichtige Tätigkeiten, auf die deine Applikation aufbaut, solltest du deshalb auf keinen Fall in den Destruktor stecken.
    In den Destruktor gehört prinzipiell die "Umkehrfunktionalität" des Konstruktors, sprich: Freigabe von belegten Ressourcen, Aufruf der Destruktoren von Unterobjekten usw.
    Zuletzt geändert von fireweasel; 05.09.2011, 21:08.

    Einen Kommentar schreiben:


  • mo78
    antwortet
    ahh gut zu wissen
    besten dank

    Einen Kommentar schreiben:


  • h3ll
    antwortet
    Du kannst nicht steuern, wann der Destruktor aufgerufen wird. Das macht der Garbage Collector von PHP. Wichtige Tätigkeiten, auf die deine Applikation aufbaut, solltest du deshalb auf keinen Fall in den Destruktor stecken.

    Einen Kommentar schreiben:


  • mo78
    hat ein Thema erstellt destrutor problem.

    destrutor problem

    Also ich versuche mal vereinfacht mein problem Darzustellen.
    Ich habe eine klasse welche mir ein Bild erstellt und in ein Verzeichniss speichert.
    Mit unset() möchte ich dann den Destructor aufrufen und das bild wieder löschen. Doch iwie löscht er das Bild sofort wieder.

    So in etwa wird das objekt verwendet:
    PHP-Code:
    //NAch Post und $x=1
    if($x==1){
    // hier wird jetzt nochmal die klasse geladen und ein $obj erzeugt

    }

    //Erster Aufruf der Seite
    if($x==0){
    // in der datei wird die klasse geladen und das obj  erzeugt und das bild //erstellt
    include ('create_pic.php'); 
    $x=1;
    //per POST wird die seite neu geladen und $x auf 1 gesetzt
     

    Naja aber irgendwie wird der destructor schon gleich beim ersten Aufruf der Seite ausgeführt. Was er aber erst soll nachdem $x==1 ist und die seite neu geladen wurde.

    schonmal danke
    mfg mo
Lädt...
X