PHP mySQL从子类构造父数据

时间:2012-12-30 21:35:40

标签: php oop mysqli

我有一个包含3个表的数据库。 personplayercoachperson表包含playercoach共有的内容,例如firstNamelastNameemail。然后,playercoach表会返回person表,其中包含personId字段。访问该网站的每个人都有一个person条目。此外,某些用户还可能拥有playercoach个条目。数据库以这种方式设置以维持规范化。

在我的代码中,我有一个personplayercoach类。 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 个答案:

答案 0 :(得分:1)

我将从您的旁边问题开始,因为术语是谈论OOP时的第一个重要部分:

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

你的班级personModelplayerModel不是一个模型,而是一个持久性控制器,或者正如你所说的,一个工厂。如果您想学习OOP以及从/向关系数据库加载/保存模型的可能性,您可以轻松编写自己的代码,类似于您的SQL代码。类DBManagement可以使用loadPersons()等操作来完成这一操作。该操作查询DB,构建所有person对象并返回它们。同样,保存可以与updatePerson(person $person)一起使用。

稍后您可以使用某种ORM(对象关系映射器)持久性框架(我自己没有PHP经验,但doctrine ORM可能是有意义的。在Java或.Net中经常Hibernate使用)。

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

相反,您可以定义每个用户始终 a person。有些用户是coach,有些用户是player,有些是两者,有些则没有。但总是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;
}

这样每个用户(= Person)对每个角色都没有。如果用户具有角色,则可以在该角色对象中保存该用户的特定角色属性。当然,一个人的角色列表可以根据该人实际拥有的角色随时间变化。

一个巧妙的副作用是该模型更符合您的数据库模式,因此您可以毫不费力地将关系数据库模式转换为模型实例,反之亦然。