![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Benutzer Registriert seit: 18.08.2005 Ort: Düsseldorf
Beiträge: 57
|
Objekt-Persistenz; PHP Session Fruits - Von unvollständigen Klassen PHP bietet uns ein Session-Management. Feine Sache, um Variablen oder auch ganze Arrays darin abzuladen. Doch leider krankt das System bei Objekten. Nicht etwa, weil es nicht könnte, sondern einfach, weil PHPs Architektur es nicht hergibt. Keine Probleme bereiten Objekte aus internen Klassen wie stdClass oder dir. Doch Objekte in PHP geschriebener Klassen kann das SessionManagement nicht wieder herstellen. Die Objekte degenerieren hierbei zu "unvollständigen Klassen", die zwar wie eine stdClass alle Eigenschaften behalten haben, aber um jegliche Methoden beraubt sind. Warum dies geschieht ist schnell erklärt, der Quellcode der Klassen ist zum Zeitpunkt des Aufrufs von session_start() nicht verfügbar und PHP ist nicht bekannt, wie das Objekt zu rekonstruieren ist. Die Lösung des Problems ist eigentlich sehr simpel. Die Klassen müssen inkludiert werden, bevor session_start() aufgerufen wird. Mit wachsendem Ausmaß des Projekts, steigt allerdings auch die Menge der genutzen Klassen und somit auch der Overhead, der zu inkludierenen Quelldateien. Natürlich kann man diesen Overhead dahingehen reduzieren, dass nur benötigte Klassen der Session zur Verfügung gestellt werden, doch zum einen ist dies höchst vermutlich sehr variabel, zum anderen ein leicht intransparent werdender Verwaltungsaufwand. - Einsatz für __autoload() PHP5 bietet allerdings eine gänzlich unscheinbare neue Funktion, die hier so richtig schön auftrumpfen kann: __autoload(). Der Zweck ist einfach beschrieben: Wird eine Klasse instanziiert, die nicht deklariert ist, erhält __autoload() deren Namen als einzigen Parameter. Das ist es eigentlich schon. Was wir nun innerhalb __autoload() anstellen, bleibt uns überlassen. Natürlich geht es nun darum, die Quelldatei der vermissten Klasse zu inkludieren. Da wir als Parameter aber nur den Klassennamen haben, müssen wir von diesem irgendwie auf die Datei schliessen und diese inkludieren. Hierbei führen uns viele Wege ans Ziel, im Rahmen des Tutorials werde ich im folgenden aber eine Möglichkeit mitsamt zugehörendem Layout im Dateisystem vorstellen. - PHP Session Fruits Das Layout der Applikation im Dateisystem ist wichtig, um generisch anhand von Klassennamen deren Dateien finden zu können. Einfach wäre es, alle Datein in einem Verzeichnis aufzubewaren, und gleich ihrer Klasse zu benennen. Das verliert aber für die meisten Entwickler sehr schnell an Übersicht. Eine praktikable Stuktur findet sich in PEAR. Hier werden Klassen thematisch in Ordnern abgelegt. Diese Ordner finden sich in den Klassennamen wieder: Code: # Dateien DB.php HTML/QuickForm.php Mail/mime.php # Klassen DB HTML_QuickForm Mail_mime Code: index.php Foo.php Foo/Bar.php Foo.php enthält die Klasse Foo, welche nur einen recht primmitiven Zähler darstelt. Foo/Bar.php mit Klasse Foo_Bar erweitert Foo um ... noch einen Zähler. Innerhalb der index.php wird nur Foo_Bar instanziiert, __autoload wird selbständig beide nötigen Dateien laden. Ein simples echo triggert __toString(), welches ein paar Informationen ausspuckt, die verdeutlichen, dass soeben persitente Objekte enstanden sind. Die "PHP Session Fruits" ^^ index.php PHP-Code: Foo.php PHP-Code: Foo/Bar.php PHP-Code: Geändert von Guradia (15.09.2005 um 13:17 Uhr). |
| | |
| | Nach oben #2 |
| Benjamin Steininger Registriert seit: 02.06.2005 Ort: weiher im tiefsten Odenwald
Beiträge: 1.183
|
Schönes Tutorial, vor allem gut geschrieben wie ich finde. Ich speichere zwar nie irgendwelche Objekte in Sessions, aber jetzt weis ich wenigstens wie ich sauber vorgehen muss wenn ich das wollte. mfg robo47 |
| | |
| | Nach oben #3 |
| Verplanter Benutzer Registriert seit: 14.12.2004
Beiträge: 227
|
Hi, das hatte ich auch schonmal gefragt aber es wurde abgeraten, frage wo liegen die Vorteile bei Objecten in Sessions und wenn nicht warum ? Finde das gehört noch dazu. (Nein ich wüsste es nicht wirklich) Aber sehr schön verständlich zu lesen ! |
| | |
| | Nach oben #4 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
ICh denke mal, dass der Vorteil einfach darin liegt, dass man den letzten Status des Objektes direkt wiederherstellen kann. Sprich: Eine Datenbank-Verbindung würde bestehen bleiben, bei einer Template-Klasse würden die Templates bereits geladen sein, etc. etc.
|
| | |
| | Nach oben #5 | |
| Benutzer Registriert seit: 18.08.2005 Ort: Düsseldorf
Beiträge: 57
| Zitat:
Vermutlich deckt sich das ganz gut mit meiner Einleitung ^^ | |
| | |
| | Nach oben #6 |
| Verplanter Benutzer Registriert seit: 14.12.2004
Beiträge: 227
|
Phu ... da bin ich nicht so tief drin hab mich dann umgestellt da es nur ein versuch war bis dahin kannte ich auch __autoload noch nicht. Hatte mir selbst eine funktion gebastellt die alle klassen geladen hatte die vorhanden waren und in $_SESSION['class'][$classname'] gespeichert und auch so angesprochen wenn ich diese benötigt hatte. http://forum.developers-guide.net/thread196.html Muss das hier auch erstmal noch aufarbeiten ... |
| | |
| | Nach oben #7 | |
| Benutzer Registriert seit: 18.08.2005 Ort: Düsseldorf
Beiträge: 57
| Zitat:
| |
| | |
| | Nach oben #9 | |||
| Benjamin Steininger Registriert seit: 02.06.2005 Ort: weiher im tiefsten Odenwald
Beiträge: 1.183
| Zitat:
www.php.net/mysql_close Zitat:
Zitat:
Aber ich lasse mich gerne eines besseren belehren mfg robo47 | |||
| | |
| | Nach oben #10 |
| Erfahrener Benutzer Registriert seit: 18.08.2005
Beiträge: 108
|
Datenbankverbindungen überleben keine Session, auch nicht persistente. Persistenten Verbindungen lassen sich zwar wiederverwenden, allerdings - muss man dazu ein connect machen, um die persistente Verbindung "auszugraben" - ist nicht von der Session abhängig, welche Verbindung wiederverwendet wird, sondern vom Apache-Prozess Geändert von Waq (15.09.2005 um 21:25 Uhr). |
| | |
| | Nach oben #13 |
| Benutzer Registriert seit: 18.08.2005 Ort: Düsseldorf
Beiträge: 57
|
Objekte = Datenstrukturen String/Int/Float = Daten Dateien/Datenbanken/Sockets etc. = Ressourcen Session = persistenter Speicher für Daten und -strukturen Damit dürfte gesagt sein, was in eine Session passt und was nicht. __wakeup() bietet aber eine Implementationsmöglichkeit, Ressourcen wiederherzustellen. |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Existiert ein gewisses Objekt im Sichtbarkeitsbereich? | Ben | PHP-Programmierung | 7 | 08.03.2007 07:47 |
| Herausfinden, wie ein existierendes Objekt heißt | Ben | PHP-Programmierung | 7 | 08.03.2006 18:34 |
| Klassenname vom HTMLElement Objekt | beny_mcde | JavaScript und AJAX | 3 | 18.01.2006 15:36 |
| Objekt Array | am82 | Allgemeine Java-Programmierung | 9 | 12.12.2005 19:01 |
| FileForm Objekt in Oracle Datenbank | Riddick | Datenbanken | 1 | 12.10.2004 13:38 |