学习面向对象的PHP:识别类,测验系统的关联


Learning OOP PHP: Identifying Classes, Associations for a Quiz System

我开发PHP web应用程序已经很长时间了,但现在正在学习OOP方法。为了学习和练习,我正在开发一个简单的"多选题"网络应用程序。当注册用户登录时,会向他显示一个测验列表。他选择一个问题,得到多个答案,其中任何一个答案都是正确的。

我的问题是:

  1. 识别类的规则是什么?我认为"测验","问题"answers"Answers"可以被声明为类。我说得对吗
  2. 这些类之间的关联类型是什么你会建议)。识别关联的规则是什么
  3. 如何分离或呈现系统类(例如数据库、验证classes)和业务域类

如果能在测验系统的背景下提供答案,我将不胜感激,因为我读了很多关于"动物狗"课程的例子。。。提前感谢您的支持。

OOP的一个特殊风格是模型-视图-控制器范式,您会发现它很有帮助。

PHP中的类通常是"对象"的表示,或者是理想情况下完成特定任务的东西。它们的集合可以一起工作以提供更全面的功能,而在单独使用时用处不大。

在MVC中,这些类通常分为(用简化的术语):

  • 模型:帮助您使用数据库的类。每个表都有一个模型,每个模型将为您提供保存和检索数据的能力,以及在事实发生前后对数据进行操作的能力。在您的情况下,问题将是一个模型,它可能包含问题本身和答案。

  • 视图:这些不是类,而是原始HTML模板,其中包含通过控制器注入的模型中的数据。在您的情况下,一种观点可能是问题观点。另一个可以表示索引页。还有一个可以提供调查表的结果。

  • 控制器:充当视图和模型之间的中间人的类。他们将从相关模型中获取数据并将其传递给视图。在您的情况下,这可能是一个测验控制器。它将从数据库中获取请求的问题并将其提供给视图,当提交答案时,控制器将把它传递给模型,看看它是否正确,并采取相应的行动。

在这个MCV的背后有一个框架(预先制作的,或者你自己制作的),它提供了许多库和抽象层,帮助你专注于应用程序逻辑。因此,会有像ActiveRecord这样的数据库抽象,会有常用过程函数的包装器,在OOP上下文中呈现,会有模板系统来帮助将数据传递到视图并对其进行格式化,等等

如果你想朝着这个方向前进,可以考虑使用现有的框架,比如CakePHP或CodeIgniter,让你领先一步。他们会让你熟悉OOP(在某种程度上),以及如何使用类对大型项目有益。

在我看来,OOP试图让事情变得更简单、更难理解,对我们程序员来说更可读。

没有规则来标识类。每个程序员都可以为类似的项目实现不同的类。当我决定实施哪些课程时,我会问自己一些问题类似:

  • 我需要实现哪些功能
  • 我是否具有为项目中的类似元素提供支持的功能

下面是我当前项目中的一个例子:我正在制作一个为用户呈现图形的分析系统。我已经创建了两个类,一个称为analytic,另一个名为analyticQueries。第一个负责所有分析数据库的更新,第二个负责从数据库中获取数据并为图形引擎做好准备。

为什么我没有制作一个database类?嗯,我觉得它太重了,在我看来,有两个主题需要分开才能更好地理解程序的工作方式:一个是编写数据库,另一个是从中读取。

思考类的另一种方法(也是规划数据库的一种好方法)是问以下问题:

  • 谁在使用这个项目
  • 使用它的人有什么行动
  • 谁在使用谁?(它可以帮助你建立关联。在我的项目中,两个分析类都连接到数据库。我可以创建第三个DBConnection类,并将其包含在这两个类中,但我认为它不会那么大,而且它在项目中还不够重要,需要自己的类)

在你的网站中,用户是登录的人,所以你的数据库中肯定需要一个user表。您肯定需要questions表,也许还需要answers表。

您可以根据数据库决定是否需要类,例如userManager可以是一个具有负责所有用户操作(登录、更新详细信息等)的功能的类,并且有一个questionManager,它将处理呈现和验证答案的问题。