Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP:从数据库检索数据_Php_Oop - Fatal编程技术网

PHP OOP:从数据库检索数据

PHP OOP:从数据库检索数据,php,oop,Php,Oop,我对OOP(以及PHP编程)相当陌生,在使用对象和将对象与db数据(在我的例子中是MySql,但这与此无关)接口时遇到一些问题 我在DB a表中有用户。我在PHP代码中声明了一个类用户,其中包含我需要的各种属性和方法。问题是把这个东西连接到数据库 我将代码放在构造函数中从db检索数据,因此当我需要处理特定用户时,我只需编写$user=newuser($user\u id)并开始处理对象。 完成后,我调用对象上的一个方法将数据保存到db上,这非常有效 当我需要单个页面中许多用户的数据时,就会出现问

我对OOP(以及PHP编程)相当陌生,在使用对象和将对象与db数据(在我的例子中是MySql,但这与此无关)接口时遇到一些问题

我在DB a表中有
用户
。我在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对数据库包装类很有用,但这是另一回事)