2009-12-08 9 views
5

私は静的なクラスメソッドを持っています。私はまた、オブジェクト変数$ DBに格納されたスクリプト内に既存のデータベース接続を持っています。どのように私はそれらの静的クラスのメソッドを呼び出すと、クラスメソッドのパラメータとして毎回この変数を渡すことなくその$ DBオブジェクトを使用させることができますか?例えばPHP:既存のデータベース接続を静的クラスメソッドに渡すには?

、今私は残念ながら、グローバルを使用することだ:

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

私が何とかしなくても、$ DB接続を取得するルーチンで自分自身を呼び出すために私の静的クラスが必要みたいですそれを再確立する。インスタンス化されていないため、静的クラスには挿入できません。

もちろん、静的クラスから通常クラスに切り替えて、$ Fooオブジェクトをインスタンス化すると、この問題は解決されます。次に、$ DB varをパブリック変数の設定として注入することができました。または、$ DB varを受け取るpublicメソッドを追加し、$ Fooオブジェクトのprivate varを設定します。または、クラスコンストラクタが$ DB varを受け入れ、$ Fooオブジェクトのプライベートvarを設定します。しかし、3つのテクニックはすべて、静的クラスから通常クラスに切り替える必要があります。

レジストリパターンまたはシングルトンパターンと呼ばれるものもあります(これは同じことだと思いますかわかりません)。私はこの問題を効率的に解決するために必要なのでしょうか?

私が「global $ DB」と呼ぶのは、人がそれを気にしているからです。

答えて

10

私はこれにシングルトンパターンを使用します。

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; 
    } 
} 

あなたはinitializeConnection()の呼び出しで一度物事を設定し、その後、ちょうど上で、その後から)(Database_Manager :: getDbを呼び出すことができます。私は、私はちょうどここDatabase_Managerと呼ぶことにしますクラスを利用しています。

このアプローチの素晴らしい点は、複数のデータベースへの接続を簡単に変更でき、データベースごとに1つのオープン接続しか保証できないことです。

__construct()関数をprivate(そのほとんどはメモリからコピーされています)と宣言するなど、シングルトンの実装の重要な点をいくつか取り除いたことに注意してください。私は全体的なアプローチを示したかっただけです。

+0

これは*私が必要としていた*正確なものでした。静的なクラスがその中にオブジェクトの永続性を維持できるかどうかはわかりませんでした。 – Volomike

+0

シングルトンの良い時。 :)喜んで助けになる。 – zombat

3

シングルトンは、あなたがやろうとしていることに対してうまくいくと思います。それ以外の場合は、すでにわかっているように非常に高価な「グローバル」キーワードを使用する必要があります。

+0

良い。私は正しい道を歩いている。あなたは私に例を挙げることができますか? – Volomike

関連する問題