gpt4 book ai didi

PHP 推荐从类实例发起数据库连接的方法

转载 作者:行者123 更新时间:2023-11-29 10:07:22 24 4
gpt4 key购买 nike

我在 PHP 中有以下类:

class Database {
...
}

class Product {
public function __construct() {
...
}
}

目前,我正在考虑拥有一个数据库类的全局实例,其中在 Product 类的 __construct 方法中,我将检查该对象是否已初始化,如下所示:

class Product {
public function __construct() {
if (!isset($db)) {
throw new Exception ('Database object not initialized.');
}
...
}
}

这是一个好的实现吗?如果没有,您有什么建议?

最佳答案

在我看来,你正在尝试构建自己的 ORM 并且练习是好的。对于大型项目,为了更舒适,请考虑采用一些 ORM,如 Doctrine、Eloquent 等(取决于框架)。

不使用依赖注入(inject)的方法可能需要在构造函数中实例化数据库对象本身。让我们举一个使用单例来提供 DB 对象的示例。

class Product {
private $pdo = null;
// other product properties here

public function __construct() {
// get db
try {
// set PDO object reference on this object
$this->pdo = PDOSingleton::getInstance();
} catch (Exception $e) {
error_log('Unable to get PDO instance. Error was: ' .
$e->getMessage();
// perhaps rethrow the exception to caller
throw $e;
}
// query DB to get user record
}

// other class methods
}

// example usage
$product = new Product(1);

当使用依赖注入(inject)时,它可能看起来像这样:

class Product {
private $pdo = null;
// other product properties here

// pass PDO object to the constructor. Enforce parameter typing
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
// query DB to get product record
}

// other class methods
}

// example usage
// instantiate PDO object. This probably happens near beginning
// of code execution and might be the single instance you pass around
// the application
try {
$pdo = new PDO(...);
} catch (PDOException $e) {
// perhaps log error and stop program execution
// if this dependency is required
}

// somewhere later in code
$product = new Product($pdo);

这看起来可能只是一个细微的差别,但使用这种方法的开发人员喜欢它,因为它:

  • 将消费类与如何实例化依赖项的细节分离。为什么用户类必须知道要使用哪个单例才能获得其 PDO 依赖项?所有类应该关心的是知道如何使用依赖项(即它具有哪些属性和方法),而不是如何创建它。这更接近于 OOP 中通常需要的单一职责原则,因为用户类只需处理实例化用户表示,而不需要实例化其依赖项。

  • 消除了需要依赖项的类之间的重复代码,因为您不需要在每个类中围绕实例化/创建依赖项进行所有处理。在示例代码中,我消除了在构造函数中处理可能失败的数据库实例化的需要,因为我知道我已经有一个作为参数传递的有效 PDO 对象(如果我没有传递一个对象,我将得到无效参数异常)。

关于PHP 推荐从类实例发起数据库连接的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51676381/

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