PHP OOP:从数据库检索数据
我对OOP(以及PHP编程)相当陌生,在使用对象和将对象与db数据(在我的例子中是MySql,但这与此无关)接口时遇到一些问题 我在DB a表中有PHP OOP:从数据库检索数据,php,oop,Php,Oop,我对OOP(以及PHP编程)相当陌生,在使用对象和将对象与db数据(在我的例子中是MySql,但这与此无关)接口时遇到一些问题 我在DB a表中有用户。我在PHP代码中声明了一个类用户,其中包含我需要的各种属性和方法。问题是把这个东西连接到数据库 我将代码放在构造函数中从db检索数据,因此当我需要处理特定用户时,我只需编写$user=newuser($user\u id)并开始处理对象。 完成后,我调用对象上的一个方法将数据保存到db上,这非常有效 当我需要单个页面中许多用户的数据时,就会出现问
用户
。我在PHP代码中声明了一个类用户
,其中包含我需要的各种属性和方法。问题是把这个东西连接到数据库我将代码放在构造函数中从db检索数据,因此当我需要处理特定用户时,我只需编写
$user=newuser($user\u id)编码>并开始处理对象。
完成后,我调用对象上的一个方法将数据保存到db上,这非常有效
当我需要单个页面中许多用户的数据时,就会出现问题,如显示完整的用户列表。使用这种方法,当我需要用户列表时,我必须实例化所有对象,这会导致代码对user_id=…
的用户进行SELECT*类型的查询,而不是像我在过程代码中所做的那样,从用户那里只选择需要的字段,其中1限制20
对于这样的问题,哪种OOP方法是正确的?除了在构造函数中检索数据,哪一个是好的实践替代方案
注意请不要建议使用任何类型的框架-我想在使用抽象层之前先学习纯OOP PHP-您的问题是没有将应用程序的层分开。您应该做的是让一个工厂类实例化处理数据库调用的用户,并让用户类只处理业务逻辑。这也有助于提高代码的可测试性
工厂类可以有两种方法。一个用于加载单个用户并对其进行实例化,另一个用于加载一组用户 工厂方法总是合理的,然后您可以实施优化的通用查询:
list($one, $two) = User::GetMultiple (array( 1, 2 ));
翻译成
SELECT * FROM users WHERE user_id IN ( 1, 2 );
说得好。另外,我要说的是,为数据库使用单例对象结构是一种可行的方法。嗯,所以当我需要一个用户时,我调用类似于
Factory::GetUserById($id)
或Factory::GetAllUsers()
等的东西,让用户构造函数不初始化参数?似乎是个好主意,我没想到,非常感谢。(似乎很难放弃程序范式:-)谢谢。我不同意单例模式,因为它使代码更难测试。您更希望使用构造函数或方法传递每个依赖项,而不是更改全局状态。marcello:是的,您的用户构造函数只接受组成实际用户的参数,而不必承担获取自己数据的负担。例如,如果您想使用phpUnit测试代码,您还可以模拟其他结构。@afullylama为什么是singleton?对不起,我不明白。。。我不必确定只实例化了一个对象,仅仅声明静态方法不是更简单吗?(也许singleton对数据库包装类很有用,但这是另一回事)