PHP OOP:创建一个新类?

时间:2012-01-04 17:42:32

标签: php oop

我有3张桌子:

users:
id
first_name
last_name

courses:
id
name

student_courses:
id
student_id
course_id
paid

用户跟踪用户,课程跟踪课程,student_courses是显示学生注册哪些课程的表格。我目前有一个“用户”类和一个“课程”类。我的问题是:我应该创建一个StudentCourses类来处理student_courses表的交互吗?

ie:我需要创建一个函数来获取用户已注册的所有课程,将其标记为已付费等等。

最好是这样做:

$student = new User($userId); 
$student->getCourses();
$student->markCourseAsPaid($courseId);

OR

$student = new User($userId);
$studentCourses = new StudentCourses($studentId);
$studentCourses->markCourseAsPaid($courseId);

5 个答案:

答案 0 :(得分:4)

如果您根据对象考虑student_coursescourses表,您会注意到student_courses是非常有趣的表,因为它包含学生的各个对象。它们是您希望将Student对象连接到的对象。您courses现在拥有的只是non-changing part of a course,例如它的名字和描述。因此,您的StudentCourse实例可以简单地聚合它。您只需要加载该实例一次,然后在StudentCourse个实例之间共享它:

Student hasMany Courses hasOne CourseDescription

对于Cohesion,您的markAsPaid方法应位于object with the most information required to fulfill it上。换句话说,它应该在Course上。但是,您可以在学生上添加payForCourse proxy method,然后在相应的markAsPaid上调用Course。您可能希望引入充当RepositoryCourses类。

答案 1 :(得分:3)

如果您将来要扩展应用程序,我会为StudentCourse创建单独的课程。现在除了连接属性(付费)之外,它只有一个附加属性,但是当你需要添加另一个属性时,无论如何都要创建这个类。

答案 2 :(得分:0)

我不会创建单独的类。我的方法是使用以下内容:

$student = new User($userId);
$course = new Course($courseId);
$student->markCourseAsPaid($course);

因为student_courses表只是一个关系,所以不应该有一个额外的类。一个额外的阶级意味着它是一个实体,它不是,它是一种关系。

我的代码与您的代码不同,因为我首先获取相应的Course实例,然后将该实例传递给用户。在我看来,仅仅传递课程的ID是很奇怪的,因为User对象只接收一个数字作为参数,这根本没有任何意义。我们可能没有课程的ID(主键),而是辅助键。然后这个方法变得无用,因为它期望PK,而不是一些SK。因为我选择首先获取Course对象,所以我们没有这个问题,因为Course对象确实知道如何通过辅助密钥检索正确的课程。

编辑:由于这是一种客观化的关系,因此使用额外课程可能会有一些意义。但接着我采用另一种方法:

$studentCourse = new StudentCourse($studentId, $courseId);
$studentCourse->markPaid();

由于学生ID和课程ID都构成了表的二级密钥,因此它们都应该在构造函数中指定。

答案 3 :(得分:0)

在这种情况下,它看起来可能有效。

通常你会在MVC(模型 - 视图 - 控制器)范例中使每个模型/表成为一个类(即学生,课程,用户等)。然后在每个类中,您可能有一个变量来关联它们。我不认为需要StudentCourses类,即使表结构显示关系,也不需要另一个类。第一个例子看起来更像面向我。你可以再做任何一种方式,但我总是选择更多面向对象的代码。

答案 4 :(得分:0)

我会为course_student创建第三个类,它依赖于数据库中的tableview,原因如下:关注点分离。

您的视图用于所有选择,表格用于插入,更新和删除。

根据inner join表中的关系

,您的视图将由两个表的所有相关字段组成(使用2 course_student)(学生和课程)

一行看起来像:

student_id, student_first_name, student_last_name, courses_id, courses_name, is_paid

如果您想让所有学生参加课程,您可以使用名为getStudentsByCourse(courseId)的方法。

如果您想获得特定学生的所有课程,您可以使用名为getStudentCourses(studentId)的方法。

如果您需要为一门课程(或多门课程)注册一组学生,您可以使用名为setStudentsCourses(studentId, courseId)的方法(其中两个参数可以是整数或数组。