【问题标题】:Subclassing and inheritance best practice子类化和继承最佳实践
【发布时间】:2013-05-20 17:31:08
【问题描述】:

我无法理解使用继承创建类及其子类的最佳实践。

比方说,我想在我的项目中实现 3 类用户

管理员、用户和联系人

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

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

  3. 管理员 这是一个用户(同样带有全名、电子邮件、电话和其他联系方式)。他们可以创建用户和/或联系人,并且(当然)他们可以登录系统(为简单起见,假设这些用户将通过提交网络表单来创建)

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

联系方式:电子邮件、电话、城市、owner_id、date_in

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

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

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

  • id:自动增量
  • owner_id:创建此用户的用户 ID
  • 全名:文本
  • 电子邮件:文本
  • 电话:短信
  • 城市:文字
  • user_type:(联系方式 || 用户 || 管理员)
  • date_in:他们注册的日期时间
  • 密码:(如果适用)

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

class Contact{
}

class User extends Contact{
}

class Admin extends User{
}

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

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

会有很多通用方法,与用户的类型无关,这就是我想要继承的原因。我也想要一个普通的数据库表。

我的主要问题是如何实现需要 de 不同东西的常用方法...例如,这是类“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;
}

【问题讨论】:

    标签: php class inheritance subclassing


    【解决方案1】:

    这看起来不错,尽管将 User 作为基类可能会更好,因为该术语更通用,因此应用范围更广。

    如果您要拥有一组使用相同方法名称但实现不同的类,那么您最好使用接口。比如:

    Interface User
    {
       public function create();
    }
    
    class Contact implements User
    {
      public function create(){}
    }
    
    class Admin implements User
    {
      public function create(){}
    }
    

    ..等等。

    【讨论】:

    • Rijndael,非常感谢!关于命名。它只是一个命名约定,与实现继承的最佳实践的实际问题无关。我也知道使用该界面,但这又不是问题的一部分。再次感谢,无论如何
    【解决方案2】:

    我个人会放弃扩展每个类的想法,并有一个接口作为三者之间的关系。

    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)
    {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 2021-06-24
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多