子类和继承的最佳实践

时间:2013-05-20 17:31:08

标签: php class inheritance subclassing

我在使用继承理解创建类及其子类的最佳实践时遇到了问题。

让我们说,我想在我的项目中实现3种类型的用户

管理员,用户和联系人

  1. 联系这是由管理员或用户创建的用户(包含全名,电子邮件,电话和其他联系人详细信息),他们无法登录系统。想象一下,他们只是每个用户的私人电话簿的成员。

  2. 用户这是管理员可以创建的用户(同样具有全名,电子邮件,电话和其他联系人详细信息)。他们可以创建联系人但不能创建其他用户,他们可以登录系统。他们也可以(并且应该)成为管理员电话簿的成员。

  3. 管理员这是一位用户(同样包含全名,电子邮件,电话和其他联系方式)。他们可以创建用户和/或联系人以及(他们)可以登录系统(为了简单起见,假设这些用户是通过提交网络表单创建的)

  4. 它们的(简化)属性是:

    联系:电子邮件,电话,城市,owner_id,date_in

    用户:电子邮件,电话,城市,owner_id,密码,date_in

    管理员:电子邮件,电话,城市,密码,date_in

    数据库表(用户)类似于:

    • id:auto_increment
    • owner_id:创建此用户的用户的ID
    • fullname:text
    • 电子邮件:文字
    • 电话:文字
    • city:text
    • user_type :(联系我们||用户||管理员)
    • date_in:他们注册的日期时间
    • 密码:(如适用)

    我不确定哇我应该使用继承......以下方案是否正确?

    class Contact{
    }
    
    class User extends Contact{
    }
    
    class Admin extends User{
    }
    

    其他一些问题: 管理员和用户中应该有一个可以创建新用户的方法(让我们将其命名为create_user())。 但是每个人都应该做不同的检查并允许不同的选项,并向数据库插入不同类型的东西。这样做的最佳做法是什么?写一个泛型类到父类并通过子类调用它,然后用额外的数据更新子类中的条目? (例如:管理员还应该将密码存储到数据库中)

    更新:也许我不够清楚......

    将会有一些常见的方法,与用户的类型无关,这就是我想要继承的原因。我还想要一个通用的数据库表。

    我的主要问题是如何实现需要不同东西的常用方法...例如,这是“User”类的user_create()

    function user_create($email, $telephone){
      dbquery("insert into users ....");
      return insert_id();
    }
    

    我想知道为Admin实现相同的方法是不是很好的做法:

    function user_create($email, $telephone, $user_type, $password=''){
      $new_id = parent::user_create($email, $telephone);
      if (user_type == 'User'){
        query("UPDATE users SET type='User', password='$password' WHERE id='$new_id'");
      }
      return $new_id;
    }
    

2 个答案:

答案 0 :(得分:0)

看起来没问题,虽然用户作为基类可能是一个更好的前景,因为该术语更通用,因此更广泛的应用。

如果您要使用一组将使用相同方法名但实现不同的类,那么最好使用接口。类似的东西:

Interface User
{
   public function create();
}

class Contact implements User
{
  public function create(){}
}

class Admin implements User
{
  public function create(){}
}

..等等。

答案 1 :(得分:0)

我个人会废弃扩展每个类的想法,并有一个充当三者之间关系的界面。

interface Person
{
    const CONTACT = 1;
    const USER    = 2;
    const ADMIN   = 3;

    public function get_name();
    public function get_mail();
    public function get_city();
    public function get_role();
    ...
}

class User implements Person
{
    ....
}

class Admin implements Person
{
    ....
}

class Contact implements Person
{
    public function get_role()
    {
        return Person::CONTACT;
    }
    ...
}

class John extends Contact
{
   ...
}

$john = new John;
$john->get_city();

if($john instanceof Person && $john->get_role() === Person::CONTACT)
{
    ...
}