让我假装我有一个 database.php 文件,其中包含对数据库的持久访问权。
<?php
$database = new PDO('mysql:host=xxx', "xxx", "xxx", array(
PDO::ATTR_PERSISTENT => true
));
?>
每次我想在控制器中查询数据库时,我该怎么办?
1 /使用global关键字获取我的全局$ database变量
<?php
include '../app/config/Database.php';
function getLastOfTheWeek()
{
global $database;
$database->query('SELECT * FROM `xxx`');
...
}
?>
2 /在函数中包含database.php
<?php
function getLastOfTheWeek()
{
include '../app/config/Database.php';
$database->query('SELECT * FROM `xxx`');
...
}
?>
3 /给这个人一些文件,他需要它
或者两者都是邪恶的,我应该使用另一种方法。
答案 0 :(得分:2)
不可强>
$dbh = new PDO (...);
function doSomething($dbh) {
$dbh->query(...);
}
确定:强>
class Something {
protected $dbh;
public function __construct($db_config) {
$this->dbh = new PDO($db_config); // still bad
}
public function doSomething() {
$this->dbh->query();
}
}
上帝层:
class Something {
protected $dbh;
public function __construct(PDO $dbh) {
$this->dbh = $dbh;
}
public function doSomething() {
$this->dbh->query();
}
}
$dbh = new PDO(...);
$s = new Something($dbh);
$s->doSomething;
答案 1 :(得分:1)
在这个简化的示例中,假设您有多个函数或函数调用,全局将会有更好的性能,因为全局将重新使用相同的连接。
但是,这并不意味着多次包含Database.php总是会变慢。假设您启用了opcache,多次包含同一文件将会产生很少的开销。问题是,每次包含此文件时都会打开一个新的PDO连接,因为您的代码是如何编写的。
还有很多其他解决方案不涉及使用全局。 DI容器通常用于在应用程序启动时解决依赖关系。如果您总是想重新使用相同的连接,单例设计模式也可能是有益的。