Php 数据库连接的延迟连接应该是这样的吗?
所以我研究了在OOP中连接数据库的好方法。如果查看我的数据库模型中的Php 数据库连接的延迟连接应该是这样的吗?,php,pdo,lazy-loading,Php,Pdo,Lazy Loading,所以我研究了在OOP中连接数据库的好方法。如果查看我的数据库模型中的connect()方法,我仅在即将查询时进行连接,如果还没有连接,则进行连接。我想这叫做“懒散的连接”,我在一次偶然的机会中发现了它 它不是意味着只为整个应用程序建立1数据库连接吗 如果我在文件A中创建了newdatabase(),在文件B中创建了newdatabase(),那么仍然会有两个连接 如果有什么帮助的话,我正在使用微MVC框架 class Database { private $pdo; privat
connect()
方法,我仅在即将查询时进行连接,如果还没有连接,则进行连接。我想这叫做“懒散的连接”,我在一次偶然的机会中发现了它
它不是意味着只为整个应用程序建立1数据库连接吗
如果我在文件A中创建了newdatabase()
,在文件B中创建了newdatabase()
,那么仍然会有两个连接
如果有什么帮助的话,我正在使用微MVC框架
class Database
{
private $pdo;
private $host;
private $databse;
private $username;
private $password;
public function __construct()
{
$this->host = Config::get('mysql/host');
$this->database = Config::get('mysql/database');
$this->username = Config::get('mysql/username');
$this->password = Config::get('mysql/password');
}
public function query($sql, $params)
{
$this->connect();
$sth = $this->pdo->prepare($sql);
$params = is_array($params) ? $params : [$params];
if ($sth->execute($params)) {
return $sth->fetch(PDO::FETCH_OBJ);
}
}
private function connect()
{
if (!$this->pdo) {
try {
$this->pdo = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->database . ';charset=utf8', $this->username, $this->password);
} catch (Exception $e) {
die($e->getMessage());
}
}
}
}
如果将new Database()的结果存储在全局变量中,则可以重用该变量,并为整个应用程序建立一个连接 如果在文件A中执行new Database(),在文件B中执行new Database(),则将有两个连接,这是正确的
您的代码的总体概念与我使用的代码类似,并且运行良好。要使一个类只有一个实例,您需要singleton模式
不过,你可以很容易地将此添加到现有的类中。我很乐意对上述答案进行评论,但声誉让我无法这样做。然而,我必须确保人们不会阅读这些内容,并相信这是正确的或好的做法 关于主题: 一个数据库连接的想法是好的,直到它不是。你可能不得不连接到第二个,然后一个单身汉会阻止你这么做。 还应使用实际参数进行配置:
Config
不允许这样做Config
类硬耦合'mysql/host'
,也不是一个好主意。有人可能会出现,并喜欢在配置中使用不同的名称。如果只使用参数进行配置,则问题将消失Config
和4个参数这一事实只会迫使您在每次使用它时查看实现希望对这件事有所了解还不算太晚。您正在混合两个概念-1。延迟加载(在本例中为延迟连接)和2。持久连接 只有在进行查询时,发布的代码才能正确地建立实际的数据库连接。代码的正确性取决于代码的使用方式。考虑下面的伪调用:
为了完整起见,我想指出,持久连接也不同于连接池,尽管可以将持久连接视为1的连接池。我知道singleton。静态类是很难测试的,我读到过惰性连接是首选的。()是否应该将此移到?以回应您的回答(和否决票)**单个db连接非常有用。当需要第二个连接时,OP自然会发现通过
Config
类传递数据库连接信息需要调整。在我看来,这不是问题的主要焦点**为什么要将连接存储在会话变量中?同意需要在每次页面加载时重新建立连接,并使用一个全局变量。对我来说,使用类似于$\u SESSION['db']
的东西存储全局变量非常方便,也更易于维护。我不同意这种观点,因为资源和对象在代码中有一条清晰的路径,这一事实带来了巨大的可维护性。使用像$\u SESSION这样的变量意味着您的代码中有一个不明显的需求。由于对$\u会话的依赖性,代码不可重用。如果要在没有上下文的上下文中运行代码,该怎么办?我确实明白了这一点:“当你到达桥的时候就过桥”。然而,你甚至不需要再构建它了,因为有很好的框架可以让这变得更容易,你可以专注于重要的业务代码。我已经删除了$\u SESSION作为全局变量示例的引用。除此之外,并非所有人都选择框架作为解决方案。对于大多数应用程序,我支持在一个简单的全局变量中重用连接的有用性。感谢您对编码方法的反馈。