![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Neuer Benutzer Registriert seit: 17.09.2006
Beiträge: 6
|
Hallo liebe Community, Sorry, wenn ich vielleicht nun eine schwachsinnige Frage stelle. In den Methoden soll eine DB-Zugriff gestattet sein. Möglich sei : global $pdo; Jedoch soll global unsauber sein und ich hab es nun über Singleton versucht. Dabei muss ich ehrlich sein, dass ich mich erst seit heute damit befasse Dabei treten wohl einige Probleme und Denkfehler auf. PHP-Code: Fatal error: Call to a member function execute() on a non-object in D:\xampp\htdocs\cms\test.php on line 34 Ich sitze seit ein paar Std. dran und ich komm nicht auf den Nenner. Vielleicht könnt ihr meine Fehler erklären |
| | |
| | Nach oben #2 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Hi „Beckham“ (oder Jan?). Du musst die Klasse selbst (also SPDO) als Singleton umsetzen. Du machst aus einer Klasse ein Singleton, um zu verhindern, dass es zur Laufzeit mehrfach instanziert wird. Daher muss eben die Klasse selbst ein Singleton sein. Ein Singleton ist also keine Fabrik, die dir ein Objekt einer anderen Klasse baut. Pack also die getInstance()-Methode in SPDO, entferne darin den $class-Parameter und ersetze new $class darin durch new SPDO. Auch die __clone()-Methode verschiebst du in SPDO und machst dort den Konstruktor privat. Siehe z.B. hier: Singleton-Beispiel Verwirrend auch hier vielleicht wieder die Bezeichnung „Singleton“ dieser Klasse. Nimm also z.B. diese Klasse (bzw. deine liegt ja nur knapp daneben), benenne sie in SPDO um und erweitere den Code. Eine abstrakte Singleton-Klasse macht in PHP wenig Sinn, da sich aus einer statischen Methode nur der Klassenname der (abstrakten) Klasse selbst auslesen lässt, nicht jedoch der Name der Klasse, über die die (geerbte) Methode dann aufgerufen wurde. Diskussion dazu z.B. hier: Late Static Binding in PHP Basti Geändert von Basti (01.03.2008 um 22:10 Uhr). |
| | |
| | Nach oben #3 |
| Neuer Benutzer Registriert seit: 17.09.2006
Beiträge: 6
|
Den Konstruktor hab ich als private gekennzeichnet, doch er gibt mir einen Fehler aus. Fatal error: Access level to SPDO::__construct() must be public (as in class PDO) in D:\xampp\htdocs\cms\inc\db\pdo.inc.php on line 86 Sonst hab ich soweit alles ausgebessert |
| | |
| | Nach oben #4 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Ja, du kannst eine Klasse nicht „dichter“ machen, indem du von ihr ableitest. Wenn also PDO einen öffentlichen Konstruktor hat, muss SPDO das auch haben. Musst dann eben anders verhindern, dass dieser mehrfach aufgerufen wird, z.B. so: PHP-Code: PHP-Code: |
| | |
| | Nach oben #5 |
| Neuer Benutzer Registriert seit: 17.09.2006
Beiträge: 6
|
Es funktioniert soweit So wie ich das sehe muss ich : $SPDO = SPDO::getInstance(); immer wieder in die Methode mit einbauen. Damit eine Verbindung möglich ist. Gibt es keine Lösung dazu einmal die $SPDO = SPDO::getInstance(); anzuwenden, damit Sie überall anwendbar ist? |
| | |
| | Nach oben #6 | ||
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Zitat:
Ein Singleton ist natürlich in etwa das gleiche in grün, da du ja von überall an das Objekt rankommst, was ja so anscheinend auch gewünscht ist. Geschickter ist aber es vielleicht, wenn du eine Struktur hast, in der nur die Objekte deine Datenbankverbindung kennen, die sie auch brauchen bzw. benutzen sollen. Wenn diese Objekte alle in eine Kategorie fallen (z.B. dass es alles DAOs sind oder DataObjects), dann kannst du sie vielleicht alle mit einer Fabrik bauen und die Verbindung damit einpflanzen. Damit wäre die DB-Verbindung dann z.B. in allen diesen Objekten via $this->Database verfügbar. PHP-Code: Basti | ||
| | |
| | Nach oben #7 |
| Neuer Benutzer Registriert seit: 17.09.2006
Beiträge: 6
|
Ich meinte halt so : Und normal sollte in der Datei index.php, die PDO Klasse einmal aufgerufen werden, somit dass Sie in den Klassen verfügbar ist. Damit ich nicht immer global verwenden muss. Ich merke dass ich noch einiges nachholen muss über php5 Aber danke für deine Hilfe PHP-Code: |
| | |
| | Nach oben #8 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
In dem Fall macht es sicher Sinn, das PDO-Objekt im Konstruktor als Objekt-Eigenschaft zu speichern: PHP-Code: Basti |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| PDO vs MDB2 | ex³ | PEAR, PECL und Frameworks | 1 | 30.07.2007 12:47 |
| Frage zu PDO Fetch Class | ex³ | PHP-Programmierung | 4 | 17.02.2007 17:46 |
| Probleme mit Strato / Arcor? | MrNiceGuy | Plauderecke | 15 | 28.12.2006 23:35 |
| Caching mittels dbm-Dateien, Probleme mit dba_popen() | Ben | PHP-Programmierung | 4 | 27.07.2006 13:23 |