2013-05-20 63 views
0

我有一个问题,理解使用继承创建它们的类和子类的最佳实践。继承和继承最佳实践

比方说,我要实现我的项目

管理员,用户3类型的用户和联系人

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

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

  3. 管理这是一个用户(同样具有全名,电子邮件,电话和其他联系方式)。他们可以创建用户和/或隐形眼镜及(五言),他们可以登录到系统中(为了简单起见,可以说,这些用户通过Web形式的submittion创建)

的(简体)属性它们是:

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

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

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

数据库表(用户)是一样的东西:

  • ID:AUTO_INCREMENT
  • owner_id:由谁这个用户的ID创建用户
  • 全称:文本
  • 电子邮件:文字
  • 电话:文字
  • 城市:text
  • user_type:(Contact ||用户||管理员)
  • date_in:日期时间,他们签署了
  • 密码:(如果适用)

我一个不知道哇,我应该使用继承...是下面的方案是否正确?

class Contact{ 
} 

class User extends Contact{ 
} 

class Admin extends User{ 
} 

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

UPDATE:也许我还不够清楚......

有将是通用的方法鱼米之乡,无关的类型用户,这就是为什么我要继承。我也想要一个共同的数据库表。

我的主要问题就在这里,是如何实现需要去不同的东西,如果它会不知常用的方法......例如,这是类“用户”的user_create()

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

是很好的做法,以实现对管理员同样的方法是这样的:

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

回答

0

这看起来不错,但用户作为基类可能会是一个更好的前景,因为该术语是更通用的,从而更广泛的应用。

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

Interface User 
{ 
    public function create(); 
} 

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

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

..等等。

+0

Rijndael,非常感谢! 关于命名。它只是一个命名约定,与实际问题无关,是实现继承的最佳实践。 另外使用接口是我知道的事情,而且再次,不是问题的一部分。 无论如何,谢谢阿迦 –

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