gpt4 book ai didi

php - 最好的做法是始终将数据库连接保持在单个实例中吗?

转载 作者:行者123 更新时间:2023-12-05 08:10:10 24 4
gpt4 key购买 nike

我想问一下,在我们需要的时候每次都使用单个数据库连接实例还是声明新的是好的做法?我有这两个设计如下所示:

这是数据库类:

<?php
class Database extends PDO {
//Variable declaration
private $host = "localhost";
private $passwd = "";
private $username = "root";
private $dbname = "";

//Connect to DB when the class construct
public function __construct($host=NULL, $dbname=NULL, $username=NULL, $passwd=NULL) {
if(isset($host) && !empty($host)) {
$this->host = $host;
}

if(isset($dbname) && !empty($dbname)) {
$this->dbname = $dbname;
}

if(isset($username) && !empty($username)) {
$this->username = $username;
}

if(isset($passwd) && !empty($passwd)) {
$this->passwd = $passwd;
}

parent::__construct("mysql:dbname=$this->dbname;host=$this->host", $this->username, $this->passwd, NULL);
parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
parent::setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}

}
?>

方法一:依赖注入(inject)

<?php
class User {
private $db;

public function __construct(Database $db) {
$this->db = $db;
}

//Some update and insert below here
}

class Employee {
private $db;

public function __construct(Database $db) {
$this->db = $db;
}

//Some update and insert below here
}
?>

所以,当我想使用这些类时,我会这样做:

<?php 
$db = new Database();

$user = new User($db);
$user->update($id,$data);

$emp = new Employee($db);
$emp->delete($id);
?>

还是其他方式?

方法二:

<?php
class User {
private $db;

public function __construct() {
$this->db = new Database();
}

//Some update and insert below here
}

class Employee {
private $db;

public function __construct() {
$this->db = new Database();
}

//Some update and insert below here
}
?>

当我想使用它时,我会:

<?php  
$user = new User();
$user->update($id,$data);

$emp = new Employee();
$emp->delete($id);
?>

哪种方法更可取或更好?如果可能,请提供解释。

最佳答案

显然,依赖注入(inject)方法更好,因为它避免了对同一数据库创建多个连接。

你将面临的问题是在类的每个构造函数中注入(inject) $db 对象。这就是依赖注入(inject)容器 可以帮助您的地方。它们的作用是处理创建对象(并因此在构造函数中传递依赖项)。

看看这篇文章:Understanding dependency injection它显示了一个使用容器依赖注入(inject)的示例。

关于php - 最好的做法是始终将数据库连接保持在单个实例中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25337037/

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