2012-03-25 69 views
0

好吧,我无法插入概览图像,但我需要为我的研究创建一个PHP应用程序,它必须允许学生注册,并且管理员可以编辑课程和学生信息。 我们不需要以OOP风格对其进行编码,但是因为它是OOP编程的最佳编程实践,所以为什么不从一开始就学习OOP。这个简单的PHP应用程序的最佳OOP方法?

我是一个初学者,但我知道关于OOP,类,继承,setter和getters以及所有那些很酷的术语的基础知识,但我很难决定这个应用程序的哪些部分应该是对象,我应该让课程和学生课程或添加,编辑和删除课程?将不胜感激任何关于如何处理和可视化这样的问题的建议。

+1

“它是编程OOP的最佳编程实践” - 说谁? – 2012-03-25 18:53:39

+0

阅读这两本书http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882和http://www.amazon.com/Applying-Introduction-Object-Oriented-Iterative-Development/dp/B003MV55EA/ref = sr_1_76?s = books&ie = UTF8&qid = 1332549040&sr = 1-76 – Songo 2012-03-25 18:54:30

+0

@OliCharlesworth好的,在我收到的书中解释说,大多数语言都是朝着OOP方向发展,这可能不是最佳实践,但而是我的技能的一个很好的补充。 – grasshopper 2012-03-25 18:58:27

回答

5

大致来说:这是我会怎么做:

  1. 存储在SQL或XML数据。您需要两个SQL表格,一个用于学生,另一个用于课程。您可以使用一个包含所有数据的XML文件,也可以使用两个文件(我推荐)。

  2. 与像一个属性创建一个名为类,例如,dataItem“$ arr_fields”对应于单个数据记录(在SQL表中的一行,或XML记录)。

  3. 的DataItem的类应该有以下方法(所有公共):

    • loadFromSQL()(或loadFromXML()
    • saveToSQL()(或saveToXML())
    • add()edit()delete()
    • a view()使用HTML的方法
    • 这些方法显然是你的sed在SQL/XML数据和类的$ arr_fields之间读取和写入数据,并在$ arr_fields中显示数据。 $ arr_fields的键是特定SQL表的SQL列名称(或XML标记或属性名称)。
  4. 尽量不要在构造函数或其他任何用于修改类数据的方法中调用loadFromSQL()或saveToSQL()。保持这些行为分开。编辑:这是一个个人喜好,它可以帮助我跟踪我的对象的状态。

  5. 创建扩展dataItem类的Student和Course类。

  6. 如果需要,您可以在扩展类中覆盖方法,例如view()方法。

  7. 然后,您可以从管理对象(如rcdmk建议)或可能从StudentFolder和CourseFolder类中调用学生和课程中的方法,其中的view()方法包含需要执行的操作的按钮。 (让StudentFolder和CourseFolder扩展您创建的Folder类)。

UPDATE:

例如:如果在一个SQL表的主键是id,那么的DataItem的loadFromSQL($ ID,$表名)应该设置$ arr_fields以便其键列名和它的值是来自主要值等于$ id的行的值。

学生,则可以覆盖loadFromSQL()如下:

class Students extends dataItem { 

    // other attributes 

    public function loadFromSQL($id) { 
    parent::loadFromSQL($id, "Students"); 
    } 

} 

编辑:复议,它可能是最好设置$ arr_fields [ “ID”] = $ ID,也可以设置$表名用dataItem的构造函数 - 那么你不必重载loadFromSQL()或为它指定参数。 loadFromSQL()应该随后加载记录(如果存在)。如果设置了$ arr_fields [“id”],saveToSQL()应该在SQL中保存$ arr_fields,如果未设置,则创建新记录。无论如何,您必须找到与您的数据交互的一致方式,这些只是可能性。但是,如果您对OOP和SQL或XML没有经验,那么您可能会为自己打开一堆蠕虫,而仅使用函数和php数组来处理您的数据可能更好。除非你有一些时间学习...

+0

好吧,我想我明白了。 dataItem将是父类,其他两个扩展该类,但是你能解释一下4.,你的意思是我应该在学生和课程类中创建这些函数,这些动作应该如何分开? – grasshopper 2012-03-25 19:30:15

+0

您不必在扩展类中重新创建这些方法 - 这是继承的要点,您只需要在父类中定义它们一次。我的意思是将动作分开:在您的代码和思维中,保留对类数据进行操作的方法,与操作SQL或XML数据的方法分开。例如,当你实例化一个Student对象并想用特定SQL行中的数据填充它时,你可以调用构造函数(它根据数据构造一个'空'对象),然后分别调用loadFromSQL() 。 – Stefan 2012-03-25 19:39:13

+0

好吧,我想我明白你的意思,谢谢我的欣赏,我可能会重读这个页面几次。 – grasshopper 2012-03-25 19:52:26

2

从一个简单的角度来看:

摘要的主要对象为这种行为类和使用方法的对象:

学生(对象)由管理员(对象),删除(动作),因此

管理员类将有一个deleteStudent方法,因为管理员删除学生。

另一个aprouch是集中所有学生相关的行动在学生类:

Student类将有一个public delete方法管理员可以使用。

任何人认为这个更好的解释方式可以编辑这个wiki。

2

想想你的系统的哪些方面实际上是对象,你知道,你可以做些什么。方法是你对对象做的事情。所以,你在课程和学生课程的正确轨道上,添加,编辑和删除将是这些类的方法。

但不要太过于沉闷。如果这不是您的核心任务目标,那么您可以通过尝试以完全正确的方式完成所有事情而迅速克服困难。如果你能够制定一个清晰的方法去到你需要去的地方,那么去做吧,如果它看起来很混乱,请稍微退一步,再学习一些。

2

你说你知道OOP的基础,但是你问你是否应该创建课程,学生类或添加,删除,编辑类。那么也许还有其他的做法,但我猜最受欢迎的一个,我唯一知道的是将名词用作类和动词作为他们的方法。因此,直观上类“添加”或“编辑”有问题。如果我是,我会做的是,想想可能被认为是一个对象的所有“实体” - 如学生,课程,讲师,课堂(房间),并取决于你的模型应该是多么先进,你可以添加更多像建设等,然后尝试实施基本的东西,如创建新的学生,注册一门课程,将老师与课程相关联等。一旦你有它的地方和它工作你可能想要添加先进的东西,如继承。例如,你可能想说,老师和学生都是一个人,所以你可能想要创建这样的抽象类并使用继承。

相关问题