Php 子类化和继承最佳实践
我在理解使用继承创建类及其子类的最佳实践时遇到了问题 比方说,我想在我的项目中实现3种类型的用户 管理员、用户和联系人Php 子类化和继承最佳实践,php,class,inheritance,subclassing,Php,Class,Inheritance,Subclassing,我在理解使用继承创建类及其子类的最佳实践时遇到了问题 比方说,我想在我的项目中实现3种类型的用户 管理员、用户和联系人 联系人这是由管理员或用户创建的用户(具有全名、电子邮件、电话和其他联系方式),他们无法登录系统。假设他们只是每个用户的私人电话簿的成员 User这是一个可以由管理员创建的用户(同样具有全名、电子邮件、电话和其他联系方式)。他们可以创建联系人,但不能创建其他用户,并且可以登录到系统。他们也可以(也应该)成为管理员电话簿的成员 Admin这是一个用户(同样有全名、电子邮件、电话和其
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,非常感谢你!关于命名。这只是一个命名约定,与实现继承的最佳实践的实际问题无关。我也知道使用界面是件事,但同样,这不是问题的一部分。无论如何,再次谢谢你