2009-12-08 72 views
5

我有一组静态类方法。我还有一个存储在对象变量$ DB中的脚本中的现有数据库连接。我如何调用这些静态类方法,并让它们使用该$ DB对象,而不必每次都将这个变量作为类方法的参数传递给它们?PHP:如何将现有的数据库连接传递给静态类方法?

例如,现在我不得不使用一个全球性的,不幸的是:

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

这就像我需要我的静态类调用自身与常规莫明得到$ DB连接,而无需重新建立它。注意我不能将它注入静态类,因为它没有实例化。

当然,如果我从静态类切换到常规类并实例化$ Foo对象,问题就解决了。然后,我可以将$ DB var作为公共变量的设置注入。或者添加一个公共方法来接收$ DB var,然后设置$ Foo对象的私有变量。或者,让类构造函数接受$ DB var并设置$ Foo对象的私有变量。但所有3种技术都要求我从静态类切换到普通类。

有人提到了一种叫做Registry模式或Singleton模式的东西(我认为它是同样的东西?不确定)。这是我需要有效解决这个问题吗?

最重要的是我避免调用“全球$ DB”,因为人们对此非常不满。

回答

10

我会,并且会为此使用单例模式。我使用一个类,我就打电话Database_Manager这里:

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()上了。

这种方法的好处是它可以很容易地修改来管理到多个数据库的连接,并且保证每个数据库只有一个打开的连接。

请注意,我遗漏了Singleton实现的一些细节,比如声明__construct()函数是私有的(上面大多数是从内存中复制的)。我只是想展示整体方法。

+0

这是*完全*我需要的,我没有意识到一个静态类可以维持它内部的对象持久性。 – Volomike 2009-12-08 03:51:40

+0

单身人士的美好时光。 :) 很高兴有帮助。 – zombat 2009-12-08 05:28:40

3

我认为一个单身人士可以很好地处理你想要做的事情。否则,您只能使用“全局”关键字,因为您已经发现该关键字非常昂贵。

+0

好。我走在正确的轨道上。你可以给我一个例子吗? – Volomike 2009-12-08 03:12:50

相关问题