在PHP中,单个对象和多个对象类的接口或类型提示

3

最近开始在PHP中使用面向对象编程(OOP)。遵循“代码到接口”的原则,当将单个对象或多个对象作为参数传递给方法时,我对要使用的类型提示感到困惑。

目前,我有一个“Student”类 - 代表我的学生表中的一行,我还有一个“Students”类,它在数组中保存多个学生对象。 为了获取一个学生的个人资料,我将包含单个学生对象的Students对象传递给profile类。我在profile类中设置了一个Students类型提示。

现在我觉得这是糟糕的代码,因为我有这样的代码行

student = new Students();students = new Students();

问题是,

我是否走上了正确的道路?

如果我删除Students类并仅使用Student,基于原则,如果profile类接受Student类型提示,我如何传递多个Student对象(假设为数组)?

我有哪些选项?

谢谢。


为什么要使用学生类,因为你可以直接在你的个人资料类中添加学生数组。 - Charaf JRA
你的意思是我将个人资料类构造函数中的学生类型提示更改为数组吗? - Ibonobij
从这个 __construct (Student $student) 到这个 __construct (Array $student) - Ibonobij
获取多个学生的个人资料是什么样子的?这是否已经定义好了?它会返回多个个人资料吗? - Ja͢ck
当profile类接收到单个或多个学生对象时,它会迭代并选择每个学生的ID,然后从数据库中获取配置文件并返回多个对象 - 每个学生一个配置文件。 - Ibonobij
2个回答

3
如果你所说的“Students”是指一组“Student”对象,那么也许更好的名称应该是“StudentCollection”或“StudentSet”。
解决类型提示问题的方法有两种:
1. 在“StudentCollection”上引入一个名为“->getProfiles()”的方法;它将调用“Profile”的方法,为其管理的每个“Student”实例返回一个配置文件数组。
2. 在“Profile”上引入一个(静态)方法,该方法操作“StudentCollection”实例。
第一种选择存在特性嫉妒,这就是我包含解决方法的原因。

我会选择第二个选项,这意味着我将使用StudentCollection来表示单个或多个学生,并将该集合传递给我的应用程序中的其他模块。可以吗?另外,为什么这个方法是静态的呢?我打算为每个学生返回档案对象,即家长档案或医疗档案。 - Ibonobij
我认为对于返回其所定义类的实例的方法来说,使用静态方法是有意义的。否则你将不得不称其为ProfileFactory。 - Ja͢ck

0

不要重复造轮子,你可以尝试使用Doctrine或者至少查看一下它的架构。

我不确定你的确切问题是什么...但如果你想自己编写代码,我建议首先将DB层抽象出来,并创建一些基础类,如Database、Table、Row、Field,它们可以描述DB堆栈并根据需要扩展一些魔法方法。因此,当你使用Student extends Table时,它会自动检查是否存在“students”表或其他你想实现的约定。或者你也可以将表名作为参数传递。

无论哪个对象从数据库返回结果集,都必须为每一行构造一个单独的Row对象,并将其添加到一个包含所有行对象的ResultSet集合中,我会将其命名为ResultSet并返回该集合。


我的数据库抽象层在Yii DAO中,我获取了一行数据,实例化了一个学生类,然后将其传递给个人资料类。现在,如果我获取多行数据并使用此结果集来实例化多个对象,我该如何将它们传递给个人资料类呢? - Ibonobij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接