[英]Best OOP approach for this simple PHP app?
好的,我无法插入概览图像,但是我需要为我的学习创建一个PHP应用程序,它必须允许学生注册,并且管理员可以编辑课程和学生信息。 我们并不需要以OOP风格对其进行编码,但是由于它是使用OOP进行编码的最佳编程实践,因此为什么不从一开始就学习OOP。
我是一个初学者,但我了解有关OOP,类,继承,setter和getter的基础知识,以及所有很酷的术语,但是我在努力确定此应用程序的哪些部分应该是对象,应该开设课程和学生课程还是添加,编辑和删除类? 任何有关如何解决和可视化此类问题的建议将不胜感激。
非常粗略:这就是我的做法:
将数据存储在SQL或XML中。 您将需要两个SQL表,一个用于学生,一个用于课程。 您可以使用一个包含所有数据的XML文件,也可以使用两个文件(建议这样做)。
创建一个类,例如,名为dataItem
的类,其属性类似于“ $ arr_fields”,该属性对应于单个数据记录(SQL表或XML记录中的单个行)。
dataItem类应具有以下方法(所有公共方法):
loadFromSQL()
(或loadFromXML()
) add()
, edit()
和delete()
view()
方法 尽量不要在构造函数中或仅用于修改类数据的任何其他方法中调用loadFromSQL()或saveToSQL()。 将这些操作分开放置。 编辑:这是个人喜好,可以帮助我跟踪对象的状态。
创建扩展dataItem类的Student和Course类。
如果需要,可以在扩展类中重写方法,例如view()
方法。
然后,您可以从Admin对象(如建议的rcdmk)或从StudentFolder和CourseFolder类(其view()方法包含需要执行的操作的按钮)中调用Student and Course中的方法。 (让StudentFolder和CourseFolder扩展您创建的Folder类)。
更新:
例如:如果您在SQL表中的主键是id
,则dataItem的loadFromSQL($ id,$ tablename)应该设置$ arr_fields,使其键为列名,并且其值是主值相等的行中的值到$ id。
在学生中,您可以按如下方式覆盖loadFromSQL():
class Students extends dataItem {
// other attributes
public function loadFromSQL($id) {
parent::loadFromSQL($id, "Students");
}
}
编辑:在重新考虑时,最好设置$ arr_fields [“ id”] = $ id并使用dataItem的构造函数设置$ tablename-然后,您永远不必重写loadFromSQL()或为其指定参数。 然后,如果该记录存在,则loadFromSQL()应该加载该记录。 如果设置了$ arr_fields [“ id”],则saveToSQL()应该在SQL中保存$ arr_fields,如果未设置,则创建一个新记录。 无论如何,您必须找到一种一致的方式来与适合您的数据进行交互,这只是可能。
但是,如果您不熟悉OOP和SQL或XML,则可能会自己打开一罐蠕虫,最好仅使用函数和数据的php数组进行赋值。 除非你有时间学习...
从简单的角度来看:
将主要对象抽象为类,并使用该对象的操作方法:
学生(对象)被管理员(对象)删除(操作),因此
管理员课程将具有deleteStudent
方法,因为管理员会删除学生。
另一个方法是将所有与学生相关的动作集中在学生类中:
学生班将具有管理员可以使用的public delete
方法。
任何以更好的解释方式认为这的人都可以编辑此Wiki。
想一想,您的系统中哪些方面实际上是对象,您可以做一些事情。 方法是您对对象执行的操作。 因此,您在课程和学生课程上走的路正确,添加,编辑和删除将是这些课程的方法。
但是不要太为之困惑。 如果这不是您的核心任务目标,则可以通过尝试以正确的方式做所有事情来迅速超越您的头脑。 如果您可以制定明确的方法到达需要去的地方,那么就去做吧,如果这似乎令人困惑,请退后一点,然后学更多。
您说您知道OOP的基础,但是问您是否应该创建课程,学生班级还是添加,删除,编辑班级。 好吧,也许还有其他做法,但我想最流行的一种,也是我所知道的唯一一种,就是使用名词作为类,将动词用作其方法。 因此,直观地讲,“添加”或“编辑”类出了问题。 如果我当时是我会做的,就是考虑所有可能被视为对象的“实体”,例如学生,课程,讲师,班级(房间),并根据模型的高级程度添加更多类似的内容。构建等。然后尝试实现一些基本的事情,例如创建新学生,注册课程,将老师与课程相关联等。一旦安装到位并且工作正常,您可能希望添加高级功能,例如继承。 例如,您可能想说老师和学生都是人,因此您可能想创建此类抽象类并使用继承。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.