Php 子类化和继承最佳实践

Php 子类化和继承最佳实践,php,class,inheritance,subclassing,Php,Class,Inheritance,Subclassing,我在理解使用继承创建类及其子类的最佳实践时遇到了问题 比方说,我想在我的项目中实现3种类型的用户 管理员、用户和联系人 联系人这是由管理员或用户创建的用户(具有全名、电子邮件、电话和其他联系方式),他们无法登录系统。假设他们只是每个用户的私人电话簿的成员 User这是一个可以由管理员创建的用户(同样具有全名、电子邮件、电话和其他联系方式)。他们可以创建联系人,但不能创建其他用户,并且可以登录到系统。他们也可以(也应该)成为管理员电话簿的成员 Admin这是一个用户(同样有全名、电子邮件、电话和其

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

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

管理员、用户和联系人

  • 联系人这是由管理员或用户创建的用户(具有全名、电子邮件、电话和其他联系方式),他们无法登录系统。假设他们只是每个用户的私人电话簿的成员

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

  • Admin这是一个用户(同样有全名、电子邮件、电话和其他联系方式)。他们可以创建用户和/或联系人,(当然)他们可以登录到系统(为了简单起见,假设这些用户是通过提交web表单创建的)

  • 它们的(简化)属性为:

    联系人:电子邮件、电话、城市、所有者id、日期

    用户:电子邮件、电话、城市、所有者id、密码、输入日期

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

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

    Interface User
    {
       public function create();
    }
    
    class Contact implements User
    {
      public function create(){}
    }
    
    class Admin implements User
    {
      public function create(){}
    }
    
    • id:自动增量
    • owner\u id:创建此用户的用户的id
    • 全名:text
    • 电子邮件:文本
    • 电话:短信
    • 城市:文本
    • 用户类型:(联系| |用户| |管理员)
    • date_in:他们注册的日期时间
    • 密码:(如适用)
    我不确定我是否应该使用遗产。。。下面的方案正确吗

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

    更新:可能我不够清楚

    将会有很多与用户类型无关的常用方法,这就是我想要继承的原因。我还想要一个普通的db表

    我这里的主要问题是,如何实现需要对不同内容进行反编译的通用方法。。。例如,这是类“user”的user\u create()

    我想知道这样对管理员实现相同的方法是否是一种很好的实践:

    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;
    }
    

    这看起来还可以,不过作为基类的用户可能会更好,因为这个术语更通用,因此应用范围更广

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

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

    。。依此类推。

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

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

    Rijndael,非常感谢你!关于命名。这只是一个命名约定,与实现继承的最佳实践的实际问题无关。我也知道使用界面是件事,但同样,这不是问题的一部分。无论如何,再次谢谢你