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

Vol*_*ike 5 php oop static global-variables

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

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

class Foo {
  public static function Bar() {
    global $DB;
    return $DB->DSN_STRING;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

zom*_*bat 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以使用initializeConnection()调用设置一次,然后从那时开始调用Database_Manager :: getDb().

这种方法的好处是可以轻松修改它来管理与多个数据库的连接,并且保证每个数据库只有一个开放连接.

请注意,我省略了Singleton实现的一些细节,例如将__construct()函数声明为private(上面的大部分内容都是从内存中复制的).我只是想展示整体方法.