gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:40:54 26 4
gpt4 key购买 nike

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

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

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

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

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

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

最重要的是我避免称呼“global $DB”,因为人们对此感到害怕。

最佳答案

我会并且确实会为此使用单例模式。我在这里使用了一个名为 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() 函数声明为私有(private)(上面的大部分内容是从内存中复制的)。我只是想展示整体方法。

关于PHP:如何将现有的数据库连接传递给静态类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1864319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com