我有下面的代码。我想要的是避免使用全局$db,因为我听说这是不好的做法,我正在寻找更健壮/实现良好的功能。
connection.php
<?php
try {
$db = new PDO('mysql:host=127.0.0.1;dbname=blop', 'blop', 'root');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
$error = $e->getMessage();
echo $error;
}
?>
Admin.php
<?php
class Admin {
public function fetch_data() {
global $db;
$sql = "SELECT * FROM `people` ORDER BY `id` DESC";
$result = $db->query($sql);
return $result;
}
public function fetch_row_count() {
global $db;
$sql = "SELECT * FROM `people`";
$result = $db->query($sql);
$num_rows = $result->rowCount();
return $num_rows;
}
public function deleteAll() {
global $db;
$deleteAll = $db->prepare("DELETE FROM `people`");
$deleteAll->execute();
}
public function deleteData($id) {
global $db;
$id = $_POST['id'];
$deleteData = $db->prepare("DELETE FROM `people` WHERE `id` = '$id'");
$deleteData->execute();
}
}
?>
依赖注入是指将类需要的所有依赖项(在本例中是PDO)传递给类。下面是一个使用构造函数注入的例子(我们将数据库传递给构造函数)。当实例化对象时,您需要这样做$admin = new Admin($db);
而不是$admin = new Admin();
还请注意,在方法deleteData
中,$id = $_POST['id'];
行应该被删除,因为它不仅使用了另一个依赖项(post请求),而且还覆盖了传递给方法的$id,使方法签名没有意义。
希望对你有帮助。
class Admin {
protected $db;
public function __construct(PDO $db) {
$this->db = $db;
}
public function fetch_data() {
$sql = "SELECT * FROM `people` ORDER BY `id` DESC";
$result = $this->db->query($sql);
return $result;
}
public function fetch_row_count() {
$sql = "SELECT * FROM `people`";
$result = $this->db->query($sql);
$num_rows = $result->rowCount();
return $num_rows;
}
public function deleteAll() {
$deleteAll = $this->db->prepare("DELETE FROM `people`");
$deleteAll->execute();
}
public function deleteData($id) {
$deleteData = $this->db->prepare("DELETE FROM `people` WHERE `id` = '$id'");
$deleteData->execute();
}
}
引入依赖注入:
class Admin {
protected $db;
public function __construct(PDO $db) {
$this->db = $db;
}
public function fetch_data() {
...
$this->db->query(...);
...
}
...
}
$pdo = new PDO(...);
$admin = new Admin($pdo);
$admin->fetch_data();
很简单,真的。您只需显式地将所有外部依赖项传递给需要它的类。