【问题标题】:Best OOP approach for this simple PHP app?这个简单的 PHP 应用程序的最佳 OOP 方法?
【发布时间】:2012-04-09 09:59:35
【问题描述】:

好的,我无法插入概览图像,但我需要为我的学习创建一个 PHP 应用程序,它必须允许学生注册,并且管理员可以编辑课程和学生信息。 我们不需要以 OOP 风格编写代码,但既然以 OOP 编写代码是最好的编程实践,为什么不从头学习 OOP。

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

【问题讨论】:

标签: php mysql oop


【解决方案1】:

非常粗略:我会这样做:

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

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

  3. dataItem 类应具有以下方法(全部公开):

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

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

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

  7. 然后,您可以从 Admin 对象(如建议的 rcdmk)或 StudentFolder 和 CourseFolder 类调用 Student 和 Courses 中的方法,这些类的 view() 方法包含需要执行的操作的按钮。 (让 StudentFolder 和 CourseFolder 扩展您创建的文件夹类)。

更新:

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

在 Student 中,您可以按如下方式覆盖 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 数组来处理您的数据。除非你有时间学习...

【讨论】:

  • 好的,我想我明白了。 dataItem 将是父类,其他两个从该类扩展,但你能解释一下 4.,你的意思是我应该在学生和课程类中创建这些函数,这些操作应该如何分开?
  • 您不必在扩展类中重新创建这些方法 - 这是继承的重点,您只需在父类中定义它们一次。我所说的保持动作分离的意思是:在你的代码和思维中,保持对类数据进行操作的方法与对 SQL 或 XML 数据进行操作的方法分开。因此,例如,当您实例化一个 Student 对象并希望用特定 SQL 行中的数据填充它时,您调用构造函数(根据其数据构造一个“空”对象),然后分别调用 loadFromSQL() 之后.
  • 好的,我想我明白你的意思了,谢谢,我很感激,我可能会重读这个页面几次。
  • 好的,但是如果您觉得能够处理所有这些任务,请仔细考虑。也许宁愿在你没有压力的时候试试这个……?今天之后我将无法为您提供详细信息。另请注意,我重新考虑了有关重新创建方法的建议 - 您可以重新创建它们(即覆盖它们),但您没有重新定义父类中的代码 - 请参阅我的答案更新。
  • 接受挑战 - 如果有一天我想建立自己的帝国,我必须学习这一点,如果我遇到困难,我会烧开水壶,煮些咖啡,准备通宵。
【解决方案2】:

从简单的角度来看:

将主要对象抽象为类,并为这些对象的操作使用方法:

学生(对象)被管理员(对象)删除(操作),所以

Admin 类将有一个 deleteStudent 方法,因为 Admin 会删除学生。

另一个方法是将所有与 Student 相关的动作集中在 Student 类中:

学生班将有一个管理员可以使用的public delete 方法。

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

【讨论】:

    【解决方案3】:

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

    但不要太拘泥于此。如果这不是你的核心任务目标,你可以通过尝试以正确的方式做所有事情来快速进入你的头脑。如果您可以制定一个明确的方法来到达您需要去的地方,那么就去做吧,如果它看起来令人困惑,请稍微退后一点并学习更多。

    【讨论】:

      【解决方案4】:

      您说您知道 OOP 的基础,但是您问是否应该创建课程、学生类或添加、删除、编辑类。好吧,也许还有其他做法,但我想最流行的一种也是我唯一知道的是将名词用作类,将动词用作它们的方法。因此,直觉上“添加”或“编辑”类有问题。如果我是的话,我会做的是考虑所有可能被视为对象的“实体”——比如学生、课程、讲师、班级(房间),并且根据你的模型应该有多先进,你可以添加更多类似构建等。然后尝试实现基本的东西,比如创建新学生、注册课程、将教师与课程相关联等。一旦你准备好并且它正在工作,你可能想要添加高级的东西,比如继承。例如,您可能想说,Teacher 和 Student 都是 Person,因此您可能想要创建这样的抽象类并使用继承。

      【讨论】:

        猜你喜欢
        • 2014-09-16
        • 2012-07-02
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多