0

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

可以说,我想在我的项目中实现 3 类用户

管理员、用户和联系人

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

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

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

它们的(简化)属性是:

联系方式:电子邮件、电话、城市、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())。但是他们每个人都应该做不同的检查并允许不同的选项,并将不同类型的东西插入数据库。这样做的最佳做法是什么?为父类写一个泛型并通过子类调用它,然后用额外的数据更新子类的条目?(例如:管理员还应该将密码存储到数据库中)

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

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

我的主要问题是如何实现需要处理不同内容的常用方法......例如,这是“用户”类的 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;
}
4

2 回答 2

0

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

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

Interface User
{
   public function create();
}

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

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

.. 等等。

于 2013-05-20T17:54:29.840 回答
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)
{
    ...
}
于 2013-05-20T17:58:42.487 回答