Closed. This question is opinion-based。它目前不接受答案。
想改进这个问题吗?更新问题,以便editing this post可以用事实和引用来回答。
去年关门了。
我把代码作为一种爱好,所以我没有接受过这方面的正规教育,所以请原谅我这个问题。我确实对这个问题做了很多研究,但没有得到一个明确的答案。
在php中,数据库访问应该选择什么类结构?
类DatabaseObject和每个表一个子类以及类DatabaseObjectArray扩展了ArrayObject并允许同时加载多个DatabaseObject。(我需要能够用foreach或类似的方法遍历它)DatabaseObject有load()和store()函数。
类数据库和接口数据库对象,其中每个表与实现接口的一个类相关。数据库可以一次加载一个对象,也可以在一个数组中加载多个对象。
sql应该在哪里完成?
如果我选择选项一,我会在DatabaseObject和DatabaseObjectArray之间有一些重复的代码,所以最好使用扩展的PDO类吗?
例如,我希望有一个名为$conditions的数组和一个addCondition($key,$value,$operator='=')函数,以便我可以首先定义条件,然后将数据加载到对象中(sql查询是基于$conditions组合的),如果我在DatabaseObject和DatabaseObject array中单独或在扩展中定义这些条件的话关于PDO?
或者我应该定义一个名为DatabaseAccess的特性,它可以在表类中使用,也可以在选项1的两个基类中使用。

最佳答案

扩展PDO永远不是“最佳实践”。事实上恰恰相反。而traits只是一种代码味道,因为它们是由解释器驱动的复制粘贴。
IMHO,最好的方法是分离业务逻辑和持久性逻辑。例如:您有一个执行用户逻辑的类和一个保存或填充此用户类实例的单独类。这种模式称为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

关于php - oop php访问数据库的最佳实践是什么? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50425810/

10-15 21:08