嘿伙计
我知道如果还有另一个Stackexchange组,Stackoverflow可能不是正确的问题 这个问题更合适,请告诉我。
所以,我正在努力学习OOP。我想我理解它很好,但有一点我真的无法想象 找出正确的方法,那就是数据库的处理。
所以,我对哪一课应该有什么感到困惑。
假设我有一个db类。在这个类的内部,我在构造函数中连接到数据库。现在让我们说吧 我有一个用户类。
所以现在的问题是:
我应该在哪里放置查询,例如创建新用户?我应该在用户类中创建一个方法,
或者我应该在DB类中创建一个方法?如果在DB类中,它应该是一个像create_user()
这样的方法吗?
或者它应该更像全局像query
,我可以传递任何我想要的查询。
这里,例如来自Github的项目:
https://github.com/christran/PHP-OOP-Login-Register-System/blob/master/classes/user.php
如您所见,所有查询方法都在db.php中,而在user.php中,他只是调用此方法。那么这是正确的方法吗?
或者根本不重要?可能,这些approches中的任何一个都比其他的更“OOP”吗?
实际上这让我很困惑,我不明白什么是更好的方式。我搜索了很多,但从来没有 找到了一篇关于这个具体问题的文章。
所以我做了什么,我在Github上寻找项目并查看他们的代码,他们是如何解决问题的...... 但是通过这种方法我更加困惑,因为你看到了两者。
这只是编码员的偏好吗?
我非常感谢你的帮助。祝你今天愉快! :)
这是我的意思的一个小例子:
在用户类内查询:
class user {
private function createUser() {
//SQL Query here (prepared statements etc...)
}
}
OR:
class user {
private function createUser() {
// Call to db.class to insert_method() ...
}
}
答案 0 :(得分:0)
基本上,您正在研究ORM。
具体回答你的问题,
我应该在用户类中创建一个方法
这是可能的,并且被称为活动记录模式,其中实体不仅包含与其自身相关的方法(如$user->getBirthday()
),还包含与数据库交互相关的方法(如$user->save()
)。 / p>
或者我应该在DB类中创建一个方法?
这是不可能的,因为这堂课会变得非常大。
但是,您可以为每个实体创建一个姐妹类,负责数据库交互。这种方法称为数据映射器模式。例如,有一个User类包含与用户相关的方法,还有一个UserMapper类,它继承自抽象映射器类,包含泛型方法$userMapper->save()
,$userMapper->find()
等。
答案 1 :(得分:-1)
包含查询的createUser方法不应该是User对象的一部分,而不应该是数据库对象的一部分。第一个是业务逻辑。后者用于管理数据库方法并提供执行语句的通用功能。这些对象之间的不同对象应该是从用户对象获取数据并生成查询以将其存储在数据库中的对象。
我认为你在这里寻找的术语是ORM (Object-relational mapping)。
这个概念是关于将对象映射到不同的,不兼容的结构,如数据库。
有可用于PHP的ORM库/框架可以为您完成大部分工作,其中一些是流行的MVC框架(如Eloquent ORM in Laravel的一部分,或者可以与它一起使用)。例如,他们通常会在您配置正确的数据库表之后通过实现所需的SQL语句来提供基本的CRUD操作。
就OOP而言,您通常会在其上面增加一层。因此,您获得了一个业务对象User,其中包含用户的规则,例如,它必须遵循用户名的规则。业务对象将强制执行这些规则并包含User对象的一般行为。为了保存,您可以使用ORM将用户对象保存到特定数据库。数据库逻辑不在User对象本身中。它不应该知道要保存自己的特定查询,也许它甚至不应该意识到加载和保存等概念。它只包含逻辑和数据,实现的其他部分负责持久化数据(可选地使用ORM框架使事情变得更容易)。