我在使用继承理解创建类及其子类的最佳实践时遇到了问题。
让我们说,我想在我的项目中实现3种类型的用户
管理员,用户和联系人
联系这是由管理员或用户创建的用户(包含全名,电子邮件,电话和其他联系人详细信息),他们无法登录系统。想象一下,他们只是每个用户的私人电话簿的成员。
用户这是管理员可以创建的用户(同样具有全名,电子邮件,电话和其他联系人详细信息)。他们可以创建联系人但不能创建其他用户,他们可以登录系统。他们也可以(并且应该)成为管理员电话簿的成员。
管理员这是一位用户(同样包含全名,电子邮件,电话和其他联系方式)。他们可以创建用户和/或联系人以及(他们)可以登录系统(为了简单起见,假设这些用户是通过提交网络表单创建的)
它们的(简化)属性是:
联系:电子邮件,电话,城市,owner_id,date_in
用户:电子邮件,电话,城市,owner_id,密码,date_in
管理员:电子邮件,电话,城市,密码,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;
}
答案 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)
{
...
}