gelöschter Benutzer

__destruct()

am 27.04.2011, 19:24 Uhr eröffnete folgenden Thread
PHP & MySQL    988 mal gelesen    2 Antwort(en).

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


UFOMelkor
Avatar UFOMelkor
Student
Content Meister (350 Beiträge)
am 27.04.2011, 21:44 Uhr schrieb UFOMelkor

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?
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:
$user = $db->findUser(1);
$user->activate();


$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.


Naturkosmetik in Bochum

Steppenhahn Ultramarathon-Community


gelöschter Benutzer
am 27.04.2011, 22:42 Uhr schrieb

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.

$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


  • 1


« zurück zu: PHP & MySQL

Das Seitenreport Forum hat aktuell 5267 Themen und 36089 Beiträge.
Insgesamt sind 48172 Mitglieder registriert.