oop php数据库访问的最佳实践是什么?

时间:2018-05-19 13:30:13

标签: php mysql oop

我编码是一种爱好所以我没有关于这个主题的正规教育,所以请原谅我这个问题。我真的已经对这个主题做了很多研究,但却无法得到明确的答案。

我应该在php中为数据库访问选择什么类结构?

  1. 类DatabaseObject和每个表的一个子类以及一个DatabaseObjectArray类,它扩展了ArrayObject并允许一次加载多个DatabaseObjects。 (我需要能够使用foreach或类似方法迭代它)DatabaseObject具有函数load()和store()。

  2. 类数据库和接口DatabaseObject,其中每个表与实现接口的一个类相关联。数据库可用于一次加载一个对象或加载数组中的多个对象。

  3. 应该在哪里完成sql?

    如果我选择选项一,我会在DatabaseObject和DatabaseObjectArray之间有一些重复的代码,那么使用扩展的PDO类会更好吗?

    例如我想要一个名为$ conditions的数组以及一个addCondition($ key,$ value,$ operator =' =')函数,以便我可以先定义条件然后load()将数据加载到对象中。(sql查询是根据$条件组装的)我应该在DatabaseObject和DatabaseObjectArray中单独定义它们还是在PDO的扩展中定义它们?

    1. 或者我应该定义一个名为DatabaseAccess的特征,该特征将在表类或选项1的两个基类中使用。

1 个答案:

答案 0 :(得分:3)

扩展PDO绝不是"最佳做法"。实际上它恰恰相反。而且特征只是代码味道,因为它们是由翻译驱动的复制粘贴。

恕我直言,最好的方法是分离业务逻辑和持久性逻辑。例如:您有一个用于执行用户逻辑的类,以及一个用于保存或填充此用户类实例的单独类。此模式称为data mapper

基本上设置如下:

$user = new Entity\User($id);
$mapper = new Mapper\User($pdo);

$mapper->fetch($user);
if ($user->isBanned() && $user->hasExpiredBan(new DateTimeImmutable)) {
    $user->removeBan();
    $mapper->store($user);
}

在这种情况下,映射器不会扩展PDO,而是将其用作依赖项。至于如何与多个映射器共享同一个PDO实例,您可以查找this old post

有关如何实现mapper本身的简单示例,您可以查看this example

相关问题