PHP mySQL从子类构造父数据

PHP mySQL从子类构造父数据,php,oop,mysqli,Php,Oop,Mysqli,我有一个包含3个表的数据库个人,球员和教练。person表包含球员和教练的共同点,例如名字、姓氏和电子邮件。然后,player和coach表有一个链接,返回到带有personId字段的person表。每个访问网站的人都有一个个人条目。此外,一些用户还可能有player或coach条目。数据库是这样设置的,以保持规范化 在我的代码中,我有一个人,球员,和教练类。球员和教练继承自个人。下面是person和player类的截断版本 class person{ private $firstN

我有一个包含3个表的数据库<代码>个人,
球员
教练
person
表包含
球员
教练
的共同点,例如
名字
姓氏
电子邮件
。然后,
player
coach
表有一个链接,返回到带有
personId
字段的
person
表。每个访问网站的人都有一个
个人
条目。此外,一些用户还可能有
player
coach
条目。数据库是这样设置的,以保持规范化

在我的代码中,我有一个
球员
,和
教练
类。
球员
教练
继承自
个人
。下面是
person
player
类的截断版本

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还很陌生,所以如果有什么我不知道的,请容忍我

(旁白,上面的课程是什么,观点?)

现在为了填充这些,我使用了我理解的模型类(是这样吗?)

但现在我的问题的核心是,如何实现
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?
    }
}
某种
工厂
类是另一种选择吗?如果是这样,将如何做到

我需要能够构造
person
player
coach
对象,因为我有属于所有这些类别的用户


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

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

  • 你的职业是
    person
    player
    coach
    。该模型的目的是将现实的重要部分投射到程序中,以便您(作为程序员)能够直观地使用与业务领域相关的术语
  • 视图不是一个标准的OOP术语,有时它是数据库中的一个抽象,所以您可以使用一个或多个表的视图,而不是直接使用表。有时它是模型的GUI
您的类
personModel
playerModel
与其说是一个模型,不如说是一个持久性控制器,或者说是一个工厂。如果您想学习OOP以及从关系数据库加载/保存模型的可能性,您可以轻松编写自己的代码,类似于SQL代码。类
DBManagement
可以通过
loadPersons()
之类的操作来实现这一点。该操作查询数据库,构建所有person对象并返回它们。同样,保存也可以与
updatePerson(person$person)
一起使用

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

另外,我建议你用另一种方式设计你的模型。实际上,您的想法是正确的,让
玩家
教练
继承
个人
,这样您就可以共享像
名字
这样的共同属性。但在这种情况下,该模型不够灵活,无法允许您在上一句中提到的内容,即一些用户属于所有类别。一种特殊情况是,一个人,实际上是一名球员,将成为一名教练。例如,如果马丁是一名球员,但现在将成为一名教练,那么你必须用一个马丁物体交换另一个。这意味着马丁不再是以前的那个人,仅仅因为他成为了一名教练,这听起来很奇怪,不是吗

相反,您可以定义,每个用户都是始终一个
。有些用户是
教练
es,有些用户是
球员
s,有些用户两者都是,有些用户没有。但总是一个

一些用于说明的伪代码:

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

abstract class PersonRole {}

class Coach extends PersonRole {}

class Player extends PersonRole {
    int position;
    string jersey;
}
班级人员{
字符串名;
字符串lastName;
列出角色;
}
抽象类PersonRole{}
类Coach扩展PersonRole{}
类播放器扩展PersonRole{
内部位置;
长绒衫;
}
这样,每个用户(=个人)都可以拥有“无对所有”角色。如果用户具有角色,则可以在该角色对象中保存该用户的特定角色属性。当然,一个人的角色列表会随着时间的推移而变化,这取决于他实际扮演的角色

一个很好的副作用是,该模型更符合您的数据库模式,因此您应该可以轻松地将关系数据库模式转换为模型实例,反之亦然

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

abstract class PersonRole {}

class Coach extends PersonRole {}

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