Klassen in Klassen verwenden ohne Speicherverschwendung
Ich möchte eine, nennen wir es globale, Klasse für SQL Zugriffe schreiben. Die Klasse soll in allen anderen Klassen aufrufbar sein. Die Frage ist jetzt, wie soll ich das anstellen ohne jedes mal die Klasse zu übergeben und somit mehrmals initialisieren?
Mein Ziel wäre ein sehr leicht zu verstehendes "Grundsystem", bsp.:
für eine Abfrage von Benutzername und Passwort.
Hier müssten sowohl die SQL-Klasse auch die SECURE-Klasse (dient zum Abfangen von Schadcode) in der Klasse von $user beinhalten sein.
Möglich wäre natürlich auch folgender unübersichtlicher Weg:
Eventuell gibt es noch einen "edleren" Weg als den in Beispiel 1 oder eine Zwischenlösung.
--
«Wir können alles schaffen, wir brauchen nur genug dressierte Affen» - infinite monkey theorem
Das wäre mal die ganz stumpfe Methode. Du könntest alternativ einen Singleton implementieren; das wäre die saubere Variante. Ein Singleton ist iene Klasse, von der es grundsätzlich nur eine Instanz geben kann. Das erreichst du, indem du den Konstruktor privat machst und die Instanzierung über eine statische Funktion machst, die eine neue Instanz zurückgibt, falls noch keine existiert, oder die bereits bestehende, wenn's schon eine gibt. Damit die Klasse weiß, ob sie schon existiert, bekommt sie eine entsprechende Klassenvariable.
Die Wikipedia hat Beispielcode für PHP5+ und ich bezweifle, daß du dich groß um deren Lizenz scheren mußt, weil es lediglich die Implementierung eines generischen Entwurfsmusters ist. Du solltest auch den Artikel lesen; da wird das Muster ausführlicher erklärt.
Ich möchte eine, nennen wir es globale, Klasse für SQL Zugriffe schreiben. Die Klasse soll in allen anderen Klassen aufrufbar sein. Die Frage ist jetzt, wie soll ich das anstellen ohne jedes mal die Klasse zu übergeben und somit mehrmals initialisieren?
Mein Ziel wäre ein sehr leicht zu verstehendes "Grundsystem", bsp.:
für eine Abfrage von Benutzername und Passwort.
Hier müssten sowohl die SQL-Klasse auch die SECURE-Klasse (dient zum Abfangen von Schadcode) in der Klasse von $user beinhalten sein.
...
Also erstmal finde ich, $user ist ein ziemlich irreführender Variablenname in diesem Fall, zumindest wenn ich deine Absicht richtig verstehe.
Dann scheinst du außerdem das Wort "Klasse" sowohl für Klassen, als auch für Objekte zu verwenden (wiederum, wenn ich dich recht verstehe). Also insgesamt bin ich mir nicht sicher, was du willst. <__<'
Falls du ein zentrales Objekt willst, das alle DB-Zugriffe regelt (und dabei von der Datenbank abstrahiert), nimm' halt eine globale Variable. Das Secure-Objekt (falls es überhaupt nötig ist, für mich klingt's, als würde es ein mysql_real_escape_string() u.ä. genauso tun) muss dann ja eigentlich nur in der SQL-Klasse verfügbar sein, das kannst du dann auch einfach als Member-Objekt der SQL-Klasse definieren.
Falls du tatsächlich nur die Klassen verfügbar haben willst: include()/require(), bzw. ~_once().
--
A human is a system for converting dust billions of years ago into dust billions of years from now via a roundabout process which involves checking email a lot.
Zu $user: Alles was mit Benutzern zu tun hat geschieht über dieses Objekt.
Zu Secure: Wäre unnötig wenn nur mysql_real_escape_string() eingesetzt würde. Unter anderem wird überprüft ob magic_quotes aktiv ist und schreibt veränderte Variablen in den Ausgangszustand um. Passwörter usw. werden auch über diese Klasse verschlüsselt. (Ja, man könnte auch md5() verwenden, aber ich verwende einen Salt und falls ich die Verschlüsselungsart ändern wollte, müsste ich diese nur einmal in dem Objekt ändern.)
Zitat von Jesus_666
Das wäre mal die ganz stumpfe Methode. Du könntest alternativ einen Singleton implementieren; das wäre die saubere Variante. Ein Singleton ist iene Klasse, von der es grundsätzlich nur eine Instanz geben kann. Das erreichst du, indem du den Konstruktor privat machst und die Instanzierung über eine statische Funktion machst, die eine neue Instanz zurückgibt, falls noch keine existiert, oder die bereits bestehende, wenn's schon eine gibt. Damit die Klasse weiß, ob sie schon existiert, bekommt sie eine entsprechende Klassenvariable.
...
Scheinbar so stumpf, das mir die Idee erst gar nicht kam.
Das Singleton werde ich mir näher anschauen. Danke!
--
«Wir können alles schaffen, wir brauchen nur genug dressierte Affen» - infinite monkey theorem