PHP推荐的从类实例启动数据库连接的方法

时间:2018-08-03 16:01:39

标签: php mysql database class oop

我在PHP中有以下课程:

df <- structure(list(Name = c("WBA-Y*08:03:01", "WBA-Y*08:169", "WBA-Y*08:03:15", 
"WBA-Y*08:03:02"), Parsed = c("WBA-Y*08:03", "WBA-Y*08:169", 
"WBA-Y*08:03", "WBA-Y*08:03"), Rank = 1:4), .Names = c("Name", 
"Parsed", "Rank"), class = "data.frame", row.names = c(NA, -4L))

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

class Database {
    ...
}

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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);

使用依赖项注入时,它可能看起来像这样:

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对象作为参数(如果没有传递一个,则将获得无效的参数异常)。 / p>