php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack (2) Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Alt 05-09-2011, 18:53
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 05-09-2011, 18:55
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #3 (permalink)  
Alt 05-09-2011, 18:57
mo78
 Registrierter Benutzer
Links : Onlinestatus : mo78 ist offline
Registriert seit: Sep 2010
Beiträge: 88
mo78 befindet sich auf einem aufstrebenden Ast
Standard

ahh gut zu wissen
besten dank
Mit Zitat antworten
  #4 (permalink)  
Alt 05-09-2011, 22:49
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

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

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

Geändert von fireweasel (05-09-2011 um 23:08 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 05-09-2011, 22:58
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

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

Zitat:
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 ;-)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #6 (permalink)  
Alt 05-09-2011, 23:30
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

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

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

$object = null;

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

Späße wie

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

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

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

Zitat:
...
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()

Geändert von fireweasel (05-09-2011 um 23:35 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 05-09-2011, 23:51
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Jetzt enttäuschst du mich aber:

$object = null;
Gut, aber wenn $object nur eine Referenz von mehreren ist, destroyed das auch nicht wirklich.

Zitat:
... 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.
Klar, aber PHP im Web gewöhnlich nix Multitasking.

Insofern lautet die Regeln in dem Umfeld eher Crap anywhere you like, this toilet’s gonna explode in 30 seconds anyway …
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #8 (permalink)  
Alt 05-09-2011, 23:55
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Gut, aber wenn $object nur eine Referenz von mehreren ist, destroyed das auch nicht wirklich.
$object = null;
ist was anderes als
unset ($object);

Zitat:
Klar, aber PHP im Web gewöhnlich nix Multitasking.
Auf einem Webserver können durchaus mehrere Scripts gleichzeitig laufen, die ein und diesselbe Ressource (Datei, Datenbankverbindung usw.) benutzen, oder?

Zitat:
Insofern lautet die Regeln in dem Umfeld eher Crap anywhere you like, this toilet’s gonna explode in 30 seconds anyway …
Wer wollte dir da widersprechen?
Mit Zitat antworten
  #9 (permalink)  
Alt 05-09-2011, 23:59
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Auf einem Webserver können durchaus mehrere Scripts gleichzeitig laufen, die ein und diesselbe Ressource (Datei, Datenbankverbindung usw.) benutzen, oder?
Ja, aber idR. sind die Scriptlaufzeiten doch so kurz, dass du mit der Freigabe einer Ressource dem Scriptende eh nur um Millisekundenbruchteile zuvor kämst - und in den Fällen halte ich es für unsinnig, mich da selber drum zu kümmern.

In den Sonderfällen, wo ich damit rechne, dass etwas länger dauert, gebe ich natürlich Ressourcen auch explizit wieder frei - bspw. mit einem session_write_close, wenn anchließend ein länger dauernder Dateidownload ausgegeben wird, o.ä.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #10 (permalink)  
Alt 06-09-2011, 00:02
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Destruktoren zum Abräumen von Member-Objekten sind nach meinem Verständnis ein Konzept von Sprachen ohne Garbage Collection, in denen es in der Verantwortung des Programmierers liegt, den Speicher von Objekten freizugeben. Ich habe das zuletzt in Delphi gemacht. Java würde ich in der Hinsicht in dieselbe Ecke wie PHP stellen: Das übernimmt die GC.

Zitat:
Zitat von fireweasel
In den Destruktor gehört prinzipiell die "Umkehrfunktionalität" des Konstruktors, sprich: Freigabe von belegten Ressourcen, Aufruf der Destruktoren von Unterobjekten usw.
Das ist für mich demnach der „klassische“ Destruktor, der in einem Umfeld ohne GC von Bedeutung ist.

Threads wie dieser beschreiben das vielleicht ganz gut:

- Is there a destructor for Java? - Stack Overflow

Zitat:
Zitat von Garth Gilmour
There is an inherited method called finalize, but this is called entirely at the discretion of the garbage collector. So for classes that need explicit tidy up the convention is to define a close method and use finalize only for sanity checking (i.e. if close has not been called do it now and log an error).
In PHP ist das vermutlich in aller Regel alles nicht sonderlich spannend, da PHP-Anwendungen in dem Sinne keinen „Laufzeit-Zustand“ haben.

Zitat:
Zitat von mo78
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.
Das ist mehr oder weniger ein Verständnisfehler. Ein PHP-Programm lebt üblicherweise nur für den Zeitraum, den es benötigt, die HTTP-Response zu generieren. Danach explodiert die Toil… wird es mitsamt aller Objekte komplett aus dem Speicher geworfen und muss beim nächsten Request wieder von Grund auf neu initialisiert werden.

Zitat:
Zitat von fireweasel
$object = null;
ist was anderes als
unset ($object);
Wenn $object der einzige Verweis auf das Objekt ist, dann glaube ich ja.

Edit: Grübel. Objektvariablen sind keine Pointer.

Geändert von mermshaus (06-09-2011 um 00:08 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 06-09-2011, 09:27
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Abgesehen von "cyclic references" sollte das aber möglich sein. Wenn nicht, ist irgendwas am Code unsauber.
Das hat nichts mit unsauberen Code zu tun.

Zitat:
Zitat von fireweasel Beitrag anzeigen
Jetzt enttäuschst du mich aber:

$object = null;
Ehrlich gesagt enttäuschst du mich

PHP-Code:
$object = new FooBar();

$blackbox->doSomething($object);

$object null;

// Ob hier das Objekt zerstört wurde, weiß man nicht. Es könnte noch immer existieren. 

Geändert von h3ll (06-09-2011 um 09:29 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 06-09-2011, 10:00
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Wo wir grade dabei sind, was passiert eigentlich bei

PHP-Code:
function cube(&$array)
{
    foreach (
$array as &$val)
        unset(
$val);
    unset(
$array);
}
$arr = array(123);

cube($arr); 
Der Code is totaler Blödsinn, aber er kompiliert und wird problemlos ausgeführt. Aber was genau passiert da mit den Referenzen usw. Werden nur die Referenzen gelöscht? Wird das Array gelöscht?

Testausgaben gehen nicht, weil natürlich nach cube $arr im PHP-Scope nicht mehr existiert, aber was passiert hinter den Kulissen?
__________________
This is what happens when an unstoppable force meets an immovable object.
Mit Zitat antworten
  #13 (permalink)  
Alt 06-09-2011, 10:05
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ApoY2k Beitrag anzeigen
Testausgaben gehen nicht, weil natürlich nach cube $arr im PHP-Scope nicht mehr existiert
Wie kommst du zu der Annahme?
Mit Zitat antworten
  #14 (permalink)  
Alt 06-09-2011, 10:36
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 359
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Najo es wird doch gelöscht in der Funktion. Oder nur die Referenz? Das ist ja genau was ich frage.

Bin grade leider nicht an einem gescheiten Rechner deshalb konnt ichs nicht selbst ausprobieren x)
__________________
This is what happens when an unstoppable force meets an immovable object.
Mit Zitat antworten
  #15 (permalink)  
Alt 06-09-2011, 10:50
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ApoY2k Beitrag anzeigen
Najo es wird doch gelöscht in der Funktion. Oder nur die Referenz? Das ist ja genau was ich frage.

Bin grade leider nicht an einem gescheiten Rechner deshalb konnt ichs nicht selbst ausprobieren x)
unset() löscht die Referenz. Steht aber auch im Handbuch.
Mit Zitat antworten
Antwort

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/102144-destrutor-problem.html
Erstellt von For Type Datum
Backlink Analyse www.php.de Kostenloser SEOkicks Backlinkcheck Post #0 Refback 19-11-2012 10:38
- RSS Feed URL - Blog RSS Feed This thread Refback 05-09-2011 22:31

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
problem, das wäre aber ein recht nutzloser titel deshalb: logik-problem o.o! newhx PHP Developer Forum 5 21-01-2003 17:46

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:25 Uhr.