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(上面的大部分内容都是从内存中复制的).我只是想展示整体方法.