Ich habe eine Reihe von statischen Klassenmethoden. Außerdem habe ich eine bestehende Datenbankverbindung in einem Skript, das in einer Objektvariablen $DB gespeichert ist. Wie rufe ich diese statischen Klassenmethoden auf und lasse sie das $DB-Objekt verwenden, ohne dass ich ihnen diese Variable jedes Mal als Parameter der Klassenmethode übergeben muss?
Im Moment muss ich zum Beispiel leider ein Global verwenden:
class Foo {
public static function Bar() {
global $DB;
return $DB->DSN_STRING;
}
}
Es ist wie ich meine statische Klasse benötigen, um sich mit einer Routine aufrufen, die irgendwie die $DB-Verbindung erhält, ohne es wiederherstellen zu müssen. Beachten Sie, ich kann es nicht in die statische Klasse injizieren, weil es nicht instanziiert ist.
Natürlich ist das Problem gelöst, wenn ich von einer statischen Klasse zu einer regulären Klasse wechsle und mein $Foo-Objekt instanziiere. Dann könnte ich die Variable $DB als Einstellung einer öffentlichen Variablen einfügen. Oder eine öffentliche Methode hinzufügen, um die $DB-Variable zu empfangen und dann eine private Variable des $Foo-Objekts zu setzen. Oder ich könnte einen Klassenkonstruktor so gestalten, dass er die $DB-Variable akzeptiert und eine private Variable des $Foo-Objekts setzt. Aber alle 3 Techniken erfordern, dass ich von einer statischen Klasse zu einer regulären Klasse wechsle.
Einige Leute haben etwas erwähnt, das Registry-Muster oder Singleton-Muster genannt wird (ich glaube, es ist dasselbe, bin mir aber nicht sicher). Ist dies, was ich brauche, um dieses Problem effizient zu lösen?
Vor allem vermeide ich es, "global $DB" zu nennen, weil die Leute darüber ausflippen.