PHP:如何将现有数据库连接传递给静态类方法?

时间:2009-12-08 03:06:52

标签: php oop static global-variables

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

例如,现在我不得不使用全局,不幸的是:

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

这就像我需要我的静态类用一个例程调用自己,以某种方式获得$ DB连接而不必重新建立它。注意我不能将它注入静态类,因为它没有实例化。

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

有些人提到了一种称为注册表模式或Singleton模式的东西(我认为这是一回事吗?不确定)。这是我需要有效解决这个问题的吗?

最重要的是我避免称之为“全球$ DB”,因为人们对此感到愤怒。

2 个答案:

答案 0 :(得分: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()函数是私有的(上面的大部分内容是从内存中复制的)。我只想展示整体方法。

答案 1 :(得分:3)

我认为Singleton可以很好地适应你想做的事情。否则,你只能使用'global'关键字,正如你已经发现的那样,这个关键字非常昂贵。