Ich habe eine singleton db-Verbindung, die ich bekomme:
$ dbConnect = meineDatenbank :: getInstance ();
was einfach genug ist. Meine Frage ist, was ist der am wenigsten rhetorische und legitime Weg, diese Verbindung in Funktionen und Klassen zu verwenden? Es erscheint albern, die Variable global deklarieren zu müssen, sie in jede einzelne Funktion zu übergeben und / oder diese Variable in jeder Funktion neu zu erstellen. Gibt es dafür eine andere Antwort?
Offensichtlich bin ich ein Neuling und ich kann mich auf zehn verschiedene Arten mit diesem Problem auseinandersetzen, von denen keines wirklich attraktiv für mich ist. Es wäre viel einfacher, wenn ich diese $ dbConnect-Variable in einer beliebigen Funktion zugänglich machen könnte, ohne sie global deklarieren oder übergeben zu müssen. Ich weiß, dass ich die Variable zum $ _SERVER-Array hinzufügen kann ... ist da etwas nicht in Ordnung Dies tun? Es scheint mir etwas unpassend.
Noch eine kurze Frage: Ist es eine schlechte Übung, dies zu tun?
$ result = MeineDatenbank :: getInstance () - & gt; Abfrage ($ query);
von direkt innerhalb einer Funktion?
Einige davon werden zum Nachtisch kommen. Bei der Arbeit erhalten wir auch einen ADODB-Verbindungshandle über
%Vor%Gleichermaßen können Sie einen Teil dieses Codes mit der Methodenverkettung abkürzen:
%Vor% Wenn Sie eine Registry verwenden, hat Ihr Aufrufcode eine konkrete Abhängigkeit von Ihrer Registry
-Klasse. Das macht das Testen deines Codes schwierig (persönlich ist dies das einzige Mal, dass ich meinen Kopf mit einer Registry an die Wand knalle) .
Wenn Sie Komponententests für Ihren Code hinzufügen möchten, möchten Sie Ihre Datenbankverbindung oft so darstellen, wie Sie möchten Bearbeiten Sie die Datenbank nicht jedes Mal, wenn Sie Ihre Testsuite ausführen.
Sie können dies immer noch umgehen, indem Sie Ihre Arbeitsumgebung untersuchen und Ihre Registrierung mit einer Pseudo-Datenbank-Abstraktionsklasse konfigurieren, aber sie ist nicht so elegant wie die Dependency-Injektion (DI).
Die beste Erklärung für DI und Container (für einen PHP-Entwickler), die ich gesehen habe, sind Fabien Potenciers Dependency Injection mit PHP 5.3 (ab Folie 9).
Sie übergeben einen DI-Container anstelle einer Registry, es bietet eine elegante und einfache Möglichkeit, Zugriffe auf Abhängigkeiten zu erhalten (wie die Registry), ist aber flexibel und lose gekoppelt, so dass Sie diese Abhängigkeiten bei Bedarf verspotten können.
Es gibt nichts Falsches an der Verwendung von Singleton in Ihrer Anwendung. Es gibt Leute, die gegen das Singleton-Muster für Datenbankabstraktionsklassen sind, weil es sich in der Zukunft als schwierig erweisen könnte, mit mehreren Verbindungen zu arbeiten. Aber in diesem Fall ist das Muster Registry , das einige Ähnlichkeiten mit Singleton , sollte auch funktionieren.
Ich würde sagen, Sie sind auf dem richtigen Weg!
Ich verwende die superglobale Variable $ GLOBALS, um meine Datenbankverbindung zu halten. Wirkt Wunder.
Hat alle Vorteile, die Sie erwähnen, und es ist absolut nichts falsch oder unangemessen, solange Sie vernünftig sind und einen eindeutigen Schlüssel für das Hash-Array und nur eine Eingabefunktion zum Einrichten der Datenbankverbindung und zum Speichern in der Datenbank verwenden Array.
Ich setze jetzt meine Ohrstöpsel an, bereit für all das Stöhnen über die Verwendung globaler Variablen!
@Downvoters - etwas vor dem Schlafengehen lesen:
Sind globale Variablen fehlerhaft?
Einige Zitate zu Ihrer Unterhaltung:
" Globale Variablen werden die ganze Zeit von vielen, vielen Programmierern verwendet. Wir nennen sie jetzt Singletons. " - DannySmurf
" Sie sind total, grundlegend, absolut, unglaublich, erstaunlich böse. Vinko Vrsalovic
Und die beste Antwort hier von Cletus selbst: Werden globale Variablen in PHP als schlechte Praxis angesehen? Wenn ja, warum?
Ich habe mich im Laufe der Jahre schon oft damit beschäftigt. Ich würde sagen, dass das Hinzufügen eines Singleton-abgeleiteten Objekts zu einer superglobalen Variable wie $ _GLOBAL oder $ _SERVER einen Großteil des Punktes der Erstellung einer Singleton-Klasse entfernt.
Die beste Vorgehensweise, wie ich es sehe, besteht darin, darauf zuzugreifen, wie Sie es vorgeschlagen haben:
%Vor%Das einzige, was ich hinzufügen möchte, ist, dass es im Fall eines lokalen Bereichs (wie einer Funktion oder Methode), in dem Sie das Singleton-Objekt mehrfach verwenden möchten, sich lohnt, etwas wie folgt zu tun:
%Vor%Tags und Links php scope database-connection