PHP OOP: Verwendung einer generischen MySQL-Klasse in anderen Klassen

8

Ich habe gerade begonnen, OOP PHP zu benutzen und bin auf eine Frage gestoßen. Ich habe eine generische mysql-Klasse eingerichtet, die es mir erlaubt, eine Verbindung zu einer Datenbank herzustellen und einige Funktionen zu haben, um Datensätze aus einer Tabelle zu erhalten:

%Vor%

Als nächstes habe ich eine Klasse, um Benutzerdetails zu erhalten:

%Vor%

Ich habe das versucht, aber ich habe den Fehler bekommen, dass die Funktion get_record nicht bekannt war. Ich habe das gelöst, indem ich $ mysql = new mysql (); zur Benutzerklasse.

Es ist jedoch ziemlich ineffizient, das mysql-Objekt für jede Klasse instanziieren zu müssen, die meine Datenbankmethoden verwendet (das sind fast alle).

Gibt es eine Möglichkeit, die mysql-Klasse und ihre Methoden allen anderen Klassen zugänglich zu machen, ohne die mysql-Klasse in jeder Methode aufrufen zu müssen?

    
Rick 06.01.2011, 19:05
quelle

6 Antworten

5

Zum einen brauchen Sie in diesem Fall kein Singleton zu verwenden - oder tatsächlich, Sie tun es fast nie. Sehen Sie sich zum Beispiel diesen Artikel an.

Zweitens denke ich, dass deine OO-Designs ein bisschen aus sind. Der Hauptpunkt der objektorientierten Programmierung und des Designs besteht darin, die Verantwortung in separate Klassen zu unterteilen. Im Moment geben Sie Ihrer Benutzerklasse zwei Hauptaufgaben - Speichern / tragen Sie die relevanten Daten eines Benutzers und fragen Sie den Datendienst ab (in diesem Fall eine einfache MySQL / Datenbank Abstraktionsschicht).

Sie sollten diese Funktionalität zuerst in ein separates Objekt verschieben. Normalerweise wird dies als Service bezeichnet - in diesem Fall ist es ein UserService . A UserService hat eine Verantwortung: Zugriff auf User -Objekte bereitstellen. Es sieht also so aus:

%Vor%

Sie binden alles zu Beginn Ihrer Anfrage zusammen (oder wo Sie auf Benutzer zugreifen müssen):

%Vor%

Es ist nicht perfekt, aber es ist ein viel saubereres Design. Ihr MySQL-Objekt tut, was es tun muss (baut eine Verbindung auf, führt Abfragen aus), Ihr Benutzerobjekt ist einfach dumm und Ihr Dienst macht nur eine Sache, dh eine Schicht zwischen der eigentlichen Speicherschicht und dem Objekt, das sie aufruft. p>     

fwielstra 06.01.2011 19:54
quelle
2

Dies ist ein häufiges Problem und daher gibt es eine gemeinsame Lösung. Wie Sie vielleicht wissen, werden in der Softwareentwicklung gebräuchliche Lösungen für häufig auftretende Probleme Design Patterns genannt.

Es gibt zwei Entwurfsmuster, die Ihnen bei der Lösung dieses Problems helfen können. In einem abstrakteren Sinn ist das Problem, dem Sie gegenüber stehen:

  

Wie kann ich Klasse A in Klasse B verfügbar machen?

Das Singleton-Muster

  

"Im Singleton-Muster kann eine Klasse eine Instanz von sich selbst an andere Klassen verteilen."

Dies ist nicht genau das, wonach Sie suchen, da Ihre Website mehrere Datenbankverbindungen verwenden kann. Es wird jedoch von vielen Menschen auf diese Weise verwendet.

Lesen Sie hier einige Informationen zur Verwendung einer Singleton-Klasse als Datenbankanbieter: Ссылка

Weitere Informationen zum Singleton-Muster in PHP: Ссылка

Ein weiterer sinnvoller Ansatz ist das Registrierungsmuster:

Registrierungsmuster

Sie können Informationen über das Registrierungsmuster auf dem folgenden Link finden, sowie eine Implementierung, die fast identisch mit der ist, die Sie suchen: Ссылка

Noch mächtiger ist eine Kombination zwischen dem Singleton und der Registrierung.

Viel Glück und viel Spaß beim Lernen von OOP PHP!

    
Richard Tuin 06.01.2011 19:26
quelle
1

Sie sollten das mysql-Objekt an jedes Benutzerobjekt übergeben. So würde es aussehen:

%Vor%     
Jon Snyder 06.01.2011 19:12
quelle
1

Entwerfen Sie Ihre mysql-Klasse so, dass sie statisch aufgerufen wird:

%Vor%

Ссылка

    
webbiedave 06.01.2011 19:15
quelle
0

mit globalen Variablen, obwohl das wahrscheinlich nicht die beste Option ist.

%Vor%

oder eine statische Methode für Ihre mysql-Klasse (siehe Singleton )

%Vor%     
Darcara 06.01.2011 19:20
quelle
0

Fange an zu denken, um Lehre zu benutzen, es ist besser

Ссылка

    
Leonardo 06.01.2011 19:57
quelle

Tags und Links