Du bist hier: Seitenreport    Forum    Web-Entwicklung    PHP & MySQL    __destruct()

__destruct()

Verfasst am: 27. 04. 2011 [19:24]
Ultima
Dabei seit: 09.07.2010
Themenersteller

759 Beiträge
Beitrag hilfreich?

Hallo Ihr,

ich bin etwas Ratlos und bräuchte einen guten Tipp.

In einem Skript habe ich ein Objekt das eine Datenbank Schnittstelle darstellt und ein Objekt was den User selber repräsentiert. Im User Objekt kann man dynamisch Parameter setzten und später wieder abrufen. Damit nicht bei jeder Parameteränderung ein Query an die Datenbank geschickt wird, werden alle auf einmal zum Schluss mit dem Aufruf des destructors in die Datenbank geschrieben. Und im DB-Objekt wird die Verbindung zur Datenbank auch durch den destructor getrennt.

Im Prinzip klappt das wunderbar aber da das DB-Objekt vor dem User-Objekt aufgebaut wird, wird es auch zu erst gelöscht und damit geht die Datenbankverbindung verloren wenn das User-Objekt die persistenten Daten speichern will. Das User-Objekt braucht das DB-Objekt um die Daten wieder zu laden, von daher kann ich auch nicht die Reihenfolge ändern.

Laut php.net wird ein Objekt gelöscht wenn alle Referenzen die auf das Objekt zeigen gelöscht werden, das hat aber nicht funktioniert. Nun suche ich nach einer Möglichkeit die Reihenfolge der Löschung irgendwie zu beeinflussen.


Schöne Grüße
Thomas

 
Verfasst am: 27. 04. 2011 [21:44]
UFOMelkor
Dabei seit: 20.10.2009

348 Beiträge
Beitrag hilfreich?

"php.net" schrieb:
Die Destruktormethode wird aufgerufen, sobald alle Referenzen auf ein bestimmtes Objekt entfernt werden oder wenn das Objekt explizit zerstört wird, oder in beliebiger Reihenfolge am Ende des Skripts.


Solange du also nicht sämtliche Referenzen auf den Benutzer löschst, greift die beliebige Reihenfolge. Hast du mal versucht, das User-Objekt explizit zu löschen?
PHP
unset($user);

Das müsste eigentlich die beliebige Reihenfolge aufheben, eine andere Möglichkeit wirst du wohl kaum finden. Allerdings musst du auch dann noch aufpassen, dass nirgendwo eine Referenz auf das Objekt übrig geblieben ist. Verlassen würde ich mich auf den GC allerdings auch dann nicht (siehe Fußnote 3: Konstruktoren und Destruktoren).

Allerdings klingt das ganze für mich etwas nach einem problematischem Design. Magische Methoden wie __destruct sind immer schwierig nachzuvollziehen. Beispiele:
PHP
$user = $db->findUser(1);
$user->activate();


PHP
$user = $db->findUser(1);
$user->activate();
$user->save();

Ich hoffe mal, es geht nicht nur mir so, aber ich finde die zweite Variante deutlich ausdrucksstärker. Magische Methoden sind überaus nützlich, aber machen den Code eben auch schwer nachvollziehbar. Sie sollten daher IMHO immer mit Bedacht eingesetzt werden.

 
Verfasst am: 27. 04. 2011 [22:42]
Ultima
Dabei seit: 09.07.2010
Themenersteller

759 Beiträge
Beitrag hilfreich?

Hi Oskar,

ich habs mit unset() versucht aber der GC frisst es nicht gleich, er kommt in Intervallen die ich noch nicht nachvollziehen kann. Ich konnte das Problem aber lösen, ich hab einfach die letzte Referenz auf die Datenbank im User-Objekt drin. So gehts wunderbar, denn die Verbindung kann dann nur geschlossen werden wenn der User schon geschlossen ist.

PHP
$user = $db->findUser(1);
$user->activate();
$user->save();


So ähnlich hab ich es auch. Nur das __construct() mir den User sucht und aktiviert. Zuvor werden Standardwerte gesetzt (id=0,name=Gast,...), die dann mit den richtigen Daten ersetzt werden. $user->save() ist bei mir __destruct(), es wird immer von allein zum Schluss aufgerufen was recht praktisch ist.


Schöne Grüße
Thomas

 




Du bist nicht eingeloggt. Bitte beachte, dass Du eingeloggt sein musst, um Themen zu erstellen oder auf Beiträge zu antworten.

RSS Feed abonnieren

Werde in Echtzeit über neue Foren-Beiträge informiert:



2 Mitglieder waren innerhalb der letzten 15 Minuten online (41 heute gesamt):
romacron, winelady

Administratoren und Moderatoren:
[keine]

Seitenreport hat 18153 registrierte Mitglieder, 3003 Themen und 29112 Beiträge.
Der aktuelle Mitgliederzuwachs liegt bei durchschnittlich 12 bestätigten Neuregistrierungen pro Tag.
Pro Tag werden im Seitenreport Forum durchschnittlich 1 neues Thema und 7 Beiträge erstellt.
Die Durchschnittszahlen berechnen sich aus den letzten 7 Tagen.

Mehrfach empfohlen

Seitenreport ist einer der bekanntesten SEO und Website Analyse Dienste im deutschsprachigen Raum und wurde u.a. schon empfohlen:
von Mr. Wong im Wong Letter
vom Leserservice der Deutschen Post
vom Technik Blog SiN
und vielen anderen

Partnerprogramm

12% Lifetime Provision auf alle Buchungen von Dir geworbener Mitglieder sowie 0,50 € für jede Registrierung. Eines der besten deutschen Partnerprogramme laut den appCharts von 100partnerprogramme.de. Nimm jetzt teil am Seitenreport Partnerprogramm und verdiene gutes Geld dabei!

* = Partnerlinks