我有一组静态类方法。我还在存储在对象变量$ 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”,因为人们对此感到愤怒。
答案 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'关键字,正如你已经发现的那样,这个关键字非常昂贵。