2012-12-30 69 views
3

我有一个包含3个表的数据库。 person,playercoachperson表包含playercoach有共同之处,如firstName,lastNameemail。然后,playercoach表格会返回person表格,其中包含personId字段。每个访问该网站的人都有一个person条目。此外,某些用户还可能有playercoach条目。数据库被设置为这种方式来维持标准化。PHP mySQL从子类构造父数据

在我的代码中,我有一个person,playercoach类。 playercoach继承自person。以下是personplayer类的截断版本。

class person{ 
    private $firstName; 
    private $lastName; 

    public function __construct($firstName, $lastName){ 
     $this->firstName = $firstName; 
     $this->lastName = $lastName; 
    } 
} 

class player extends person{ 
    private $position; 
    private $jersey; 

    public function __construct($firstName, $lastName, $position, $jersey){ 
     parent::__construct($firstName, $lastName); 
     $this->position = $position; 
     $this->jersey = $jersey; 
    } 
} 

作为一个单挑我对OOP很新,所以如果有些事情我不知道。

(方的问题,什么是考虑上述类,有何看法?)以填充这些我用我的理解是模型类

现在(是吗?)。

class personModel{ 
    public function getPerson($personId){ 
     $sql = "SELECT * FROM `person` WHERE `personId` = '$personId'"; 
     //skipping some sql stuff in here 
     return new person($sql['firstName'], $sql['lastName']); 
    } 
} 

但是现在我的问题的核心是如何实施playerModel

class playerModel{ 
    public function getPlayer($playerId){ 
     //would I do a join SQL here? 
     //or would I call personModel::getPerson() 
     //or do both these options couple the two classes too tightly? 
    } 
} 

请问某种factory类是另一种选择吗?如果是这样,那将如何完成?

我需要能够构建personplayercoach对象,因为我有会陷入所有这些类别的用户。

任何反馈意见,非常感谢,我会经常检查回来,如果我需要澄清任何事情。

回答

1

我将与你身边的问题开始,因为术语谈到OOP,当第一重要的部分:

  • 你的类personplayercoach是模型。该模型的目的是将现实的重要部分投影到一个程序中,以便您(作为程序员)可以直观地处理关于业务领域的术语。
  • 视图不是一个标准的OOP术语,有时它是一个数据库中的抽象,因此您可以使用有关一个或多个表的视图而不是直接使用表。有时它是一个模型的GUI。

您的类personModelplayerModel不像持久性控制器或者如您所说的那样是一个工厂。如果您想了解OOP以及将模型从关系数据库加载/保存到关系数据库的可能性,您可以轻松编写自己的代码,类似于您的SQL代码。类DBManagement可以通过像loadPersons()这样的操作来实现。该操作查询数据库,构建所有人员对象并将其返回。同样,保存可以与updatePerson(person $person)一起使用。

稍后,您可以使用某种ORM(对象关系映射程序)持久性框架(我自己没有PHP经验,但doctrine ORM可能会互相影响,在Java或.Net中经常使用Hibernate)。

增加我建议你以另一种方式设计你的模型。事实上,你有正确的想法让playercoach继承person,以便您可以共享像firstName一样的共同属性。但在这种情况下,该模型不够灵活,无法允许您在最后一句中提到的内容,即某些用户属于所有类别。一个特殊的情况是,一个人,实际上是一个球员,将成为一名教练。例如,如果马丁是一名球员,但现在将成为一名教练,则必须将一名马丁对象换成另一名。这意味着马丁和以前不一样,只是因为他成了教练,这听起来很奇怪,不是吗?

相反,您可以定义,即每个用户都是总是 a person。一些用户是coach es,其他一些是player s,有些是两者,有些是没有的。但总是一个person

为了说明一些伪代码:

class Person { 
    string firstName; 
    string lastName; 
    List<PersonRole> roles; 
} 

abstract class PersonRole {} 

class Coach extends PersonRole {} 

class Player extends PersonRole { 
    int position; 
    string jersey; 
} 

这样每个用户(=人)可以没有对每一个角色。如果用户具有角色,那么在该角色对象中,您可以保存该用户的特定角色属性。当然,一个人的角色列表可以随着时间的推移而改变,根据这个人实际拥有什么样的角色。

一个简单的副作用是,这个模型更符合你的数据库模式,所以你应该没有问题将关系数据库模式转换成模型实例,反之亦然。

相关问题