FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

[PHP][Object_programming]Seesion & Lifetime

[PHP][Object_programming]Seesion & Lifetime 2007-08-13 14:24
Antony Meruser
Moin fbiler,

Ich arbeite mit zwei Klassen, die eine stellt Artikel dar, die andere stellt einen Warenkorb dar.
Man kann es sich schon denken, ein Warenkorbobjekt kann mehrere Artikelobjekte enthalten.

So, das Warenkorbobjekt legt die Artikel in einem Array ab, und dieses Array wird im Laufe einiger Methoden in die Session abgelegt.

Wenn ich jetzt innerhalb einer Testklasse mit einer vollen Session starte, und diese wieder in das Array ablege, liegen dort aber keine Objekte der Klasse Artikel mehr wie erwartet.
Es wird also folgende Fehlermeldung ausgegeben, wenn ich eine Testklasse zweimal Aufrufe (also beim zweiten Mal eine volle Session vorhanden ist):
Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>artikel</b> of the object you are trying to operate on was loaded _before_ the session was started in /adresse_zur_klasse/warenkorb.php on line 109
Wenn ich dann das Array ausgeben lasse, sehe ich halt diese unfertigen Objekte:
__PHP_Incomplete_Class Object (und [__PHP_Incomplete_Class_Name] )

Wie sollte ich weiter vorgehen oder woran kann das liegen?

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 14:33
Popcorn
Ich blicke noch nicht ganz durch die Konstruktion durch, aber davon abgesehen scheint es mir sinnvoller, das Warenkorbobjekt und nicht einen Array aus dem Objekt selbst, in der Session abzulegen. Das sollte dann doch klappen.

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 14:39
Anonymer User
Ohne jetzt den kompletten Code zu kennen: Lies die Fehlermeldung!
Du mußt erst die Klassen inkludieren und dann session_start machen, ansonsten weiß PHP nicht wie es deserialisieren soll…

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 14:40
Anonymer User
Ich blicke noch nicht ganz durch die Konstruktion durch,

was wohl daran liegt, dass ich mit Quellcode (aus mehreren Gründen) sehr sparsam war,
vielleicht ist ja auch meine Formulierung zu schwammig, aber egal, dieser Tipp:
aber davon abgesehen scheint es mir sinnvoller, das Warenkorbobjekt und nicht einen Array aus dem Objekt selbst, in der Session abzulegen. Das sollte dann doch klappen.

wäre auch mein Favorit, nur weiss ich im Moment nicht ob ich das so umsetzten darf, die Idee mit dem Array stammt nicht von mir… mal sehen

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 14:48
korelstar
Ohne jetzt den kompletten Code zu kennen: Lies die Fehlermeldung!
Du mußt erst die Klassen inkludieren und dann session_start machen, ansonsten weiß PHP nicht wie es deserialisieren soll…

Entweder löst sich damit schon das Problem. Falls du aber gar nicht session_start manuell aufrufst, sondern "session.auto_start" in deiner PHP-Konfiguration verwendest, dann hast du ein Problem. Dann kannst du nämlich keine Objekte in deiner Session speichern (genau das tust du ja), da du die entsprechenden Klassen gar nicht vor der Session deklarieren kann. Siehe dazu auch: http://de.php.net/session

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 14:57
Anonymer User
Ohne jetzt den kompletten Code zu kennen: Lies die Fehlermeldung!
Du mußt erst die Klassen inkludieren und dann session_start machen, ansonsten weiß PHP nicht wie es deserialisieren soll…

Entweder löst sich damit schon das Problem. Falls du aber gar nicht session_start manuell aufrufst, sondern "session.auto_start" in deiner PHP-Konfiguration verwendest, dann hast du ein Problem. Dann kannst du nämlich keine Objekte in deiner Session speichern (genau das tust du ja), da du die entsprechenden Klassen gar nicht vor der Session deklarieren kann. Siehe dazu auch: http://de.php.net/session

doch ich habe die Fehlermeldung gelesen; und ja die includes tauchen in meinem Quellcode vor dem session_start auf - doch dies ändert nichts an den unfertigen Objekten…

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 15:38
Anonymer User
doch ich habe die Fehlermeldung gelesen; und ja die includes tauchen in meinem Quellcode vor dem session_start auf - doch dies ändert nichts an den unfertigen Objekten…

Ok, das kann ich ja nicht ahnen.

Evtl. rufst Du indirekt schon vorher die Session auf. Mgl. Lösung: Singleton für den Session-Zugriff.

Quick & dirty: speicher in der session die Daten als Array und übergebe dann dem Konstruktor Deines Objekts diesen Array. Alternativ gibt es sowas wie setFrom() bei den DB_DataObjects…

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 16:03
korelstar
doch ich habe die Fehlermeldung gelesen; und ja die includes tauchen in meinem Quellcode vor dem session_start auf - doch dies ändert nichts an den unfertigen Objekten…

Du solltest trotzdem vorsichtshalber prüfen, was dir phpinfo() zum Wert von "session.auto_start" anzeigt.

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 17:07
Anonymer User
doch ich habe die Fehlermeldung gelesen; und ja die includes tauchen in meinem Quellcode vor dem session_start auf - doch dies ändert nichts an den unfertigen Objekten…

Ok, das kann ich ja nicht ahnen.
stimmt, nur sollte das eigendlich für den Ersteller eines solchen Threads Pflicht sein;
ich mein damit, Fehlermeldungen zu lesen, selbst probieren, suchen…

Evtl. rufst Du indirekt schon vorher die Session auf.
…vielleicht ist das der richtige tipp!
Mgl. Lösung: Singleton für den Session-Zugriff.
ich muss gestehen: habe noch nie das singleton-muster verwendet (muss mir erstmal anschauen, wie das geht
Quick & dirty: speicher in der session die Daten als Array und übergebe dann dem Konstruktor Deines Objekts diesen Array. Alternativ gibt es sowas wie setFrom() bei den DB_DataObjects…
naja, dieser Quick & DirtyVorschlag ist ja eben jene Implementierung die ich zur Zeit verwende und anscheinend so nicht klappt…

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 17:08
Anonymer User
doch ich habe die Fehlermeldung gelesen; und ja die includes tauchen in meinem Quellcode vor dem session_start auf - doch dies ändert nichts an den unfertigen Objekten…

Du solltest trotzdem vorsichtshalber prüfen, was dir phpinfo() zum Wert von "session.auto_start" anzeigt.

..dummerweise bin ich jetzt auf einem anderen Rechner und habe so keinen Fernzugriff auf den server… aber ich werde es bei Gelegenheit testen….

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-13 19:14
tekai
Wenn du ein Objekt in der Session hast muß die Klasse auf jeder Seite "included" werden auf der die Session läuft. Fehlt die Klasse irgendwo geht PHP leider Informationen zur Klasse verloren.

RE: [PHP][Object_programming]Seesion & Lifetime 2007-08-14 19:34
Anonymer User
Du solltest trotzdem vorsichtshalber prüfen, was dir phpinfo() zum Wert von "session.auto_start" anzeigt.
… ist off

Wenn du ein Objekt in der Session hast muß die Klasse auf jeder Seite "included" werden auf der die Session läuft. Fehlt die Klasse irgendwo geht PHP leider Informationen zur Klasse verloren.

Ich hab keine Ahnung wie das in meinem noch recht simplen Testlauf
(test.php included warenkorb+artikel, startet session und benutzt dann die Objekte)
noch fehlen sollte bzw. wo noch includiert werden sollte…
Aber an sich finde ich diesen Lösungsvorschlag sehr strange, wenn die Klassen schon zur Verfügung stehen warum noch mal includieren….

Mgl. Lösung: Singleton für den Session-Zugriff.
Anhand der wikipedia beispiele konnte ich nicht erkennen wie man das am besten für nen simplen session_start macht bzw. ich mein jetzt keinen Vorteil dadurch zu gewinnen…



Im Moment schreibe ich große Teile um - lege Warenkorb in die Session statt einem Array und verwende jetzt auch fast überall nur noch ganze Objekte; damit hat sich mein Problem verschoben - kriege nicht mehr obige Fehlermeldung, jedoch sind an mancher Stelle jetzt leere Objekte… (aber ich muss mich da nochmal heransetzen bevor ich konkreter werden kann.

Aber auf jeden Fall Danke für die schnelle Hilfe!