2009-12-08 5 views
5

Ich habe eine Reihe von statischen Klassenmethoden. Ich habe auch 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 diese Variable jedes Mal als Parameter der Klassenmethode übergeben zu müssen?PHP: Wie bestehende Datenbankverbindung zu statischen Klassenmethoden übergeben?

Zum Beispiel gerade jetzt bin ich mit einem global verwenden, leider:

class Foo { 
    public static function Bar() { 
    global $DB; 
    return $DB->DSN_STRING; 
    } 
} 

Es ist wie ich brauche, um meine statische Klasse selbst mit einer Routine aufzurufen, die irgendwie die $ DB-Verbindung bekommt, ohne mit stelle es wieder her. Hinweis: Ich kann es nicht in die statische Klasse einfügen, da es nicht instanziiert wird.

Natürlich ist das Problem gelöst, wenn ich von einer statischen Klasse zu einer regulären Klasse wechseln und mein $ Foo-Objekt instanziieren. Ich könnte dann die $ DB-Variable als Einstellung für eine öffentliche Variable injizieren. Oder fügen Sie eine öffentliche Methode hinzu, um die $ DB-Variable zu erhalten, und legen Sie dann eine private Variable des $ Foo-Objekts fest. Oder machen Sie einen Klassenkonstruktor, der die $ DB-Variable akzeptiert, und legen Sie eine private Variable des $ Foo-Objekts fest. Aber alle 3 Techniken erfordern, dass ich von einer statischen Klasse zu einer regulären Klasse wechseln.

Einige Leute haben etwas erwähnt, das ein Registrierungsmuster oder ein Singleton-Muster genannt wird (ich denke, es ist dasselbe? Nicht sicher). Ist das, was ich brauche, um dieses Problem effizient zu lösen?

Die Sache ist vor allem, dass ich vermeiden, "global $ DB" zu nennen, weil die Leute ausflippen.

Antwort

10

Ich würde, und tun, das Singleton-Muster dafür verwenden. Ich benutze eine Klasse, die ich gerade Database_Manager hier nennen würde:

class Database_Manager 
{ 
    private static $instance; 
    private $db_connection; 

    public static function getInstance() 
    { 
     if (self::$instance == null) { 
      $className = __CLASS__; 
      self::$instance = new $className(); 
     } 
     return self::$instance; 
    } 

    public static function initializeConnection($connectionInfo) 
    { 
     $db = self::getInstance(); 
     //call init functions.. connect to db, etc 
      //save connection to $db->db_connection; 

    } 

    public static function getDb() 
    { 
     $db = self::getInstance(); 
     return $db->db_connection; 
    } 
} 

Sie können Dinge einrichten einmal mit dem initializeConnection() -Aufruf, und dann rufen Sie einfach Database_Manager :: getDb() von da an aus.

Das Schöne an diesem Ansatz ist, dass es leicht geändert werden kann, um Verbindungen zu mehreren Datenbanken zu verwalten, und Sie haben garantiert immer nur eine offene Verbindung pro Datenbank.

Beachten Sie, dass ich etwas von der Bedeutung der Singleton-Implementierung weggelassen habe, wie zum Beispiel das Deklarieren der __construct() - Funktion als privat (das meiste davon wird aus dem Speicher kopiert). Ich wollte nur den Gesamtansatz zeigen.

+0

Das war * GENAU *, was ich brauchte, und ich wusste nicht, dass eine statische Klasse eine Objektpersistenz darin aufrechterhalten konnte. – Volomike

+0

Gute Zeiten mit Singletons. :) Ich bin froh, Ihnen helfen zu können. – zombat

3

Ich denke, ein Singleton würde gut funktionieren für das, was Sie versuchen zu tun. Andernfalls müssen Sie nur das Schlüsselwort "global" verwenden, das, wie Sie bereits herausgefunden haben, extrem teuer ist.

+0

Gut. Ich bin auf dem richtigen Weg. Kannst du mir ein Beispiel geben? – Volomike

Verwandte Themen