我的父类User
有两个子类User_Instagram
和User_Email
。我使用这些类来支持多种登录方法:用户可以选择使用Instagram,电子邮件甚至两者登录(一次使用电子邮件,然后再使用Instagram)。
User_Instagram
类包含Instagram特定的用户参数(如InstagramUserId,Bio等)。 User_Email
类用于使用电子邮件/密码组合的典型注册。
我试图弄清楚如何以OOP投诉的方式实现这一点。我需要能够:
User_Instagram->register($token)
或User_Email->register($email,$password)
User
课程,以便能够访问一般用户信息(例如$userid
)并了解他登录的服务(电子邮件,Instagram或两者)。我目前实施的方式有点难以维护 - 而且我很确定这是完全错误的(称之为直觉)。
父类
class User {
protected $userid = NULL;
protected $loggedInServices = array('instagram'=>0,'email'=>1);
...
}
儿童班:
class User_Instagram extends User {
private $instagram_userid;
private $bio;
private $profile_pic;
private $token;
...
public function signIn( $token ) { ... }
public function register( $token ) { ... }
}
class User_Email extends User {
private $email;
private $password; # hashed, of course ;)
public function signIn( $email, $password) { ... }
public function register( $email, $password, $passport_number) { ... }
}
我最初认为Factory类可能在这里工作,但是在该场景中无法实例化父类。有什么想法吗?
答案 0 :(得分:2)
为什么要从用户类继承以实现登录过程。我会改变它:
class User {
protected $userid = NULL;
public function setUserId($id) { ... }
...
}
class Login_Instagram {
private $instagram_userid;
private $bio;
private $profile_pic;
private $token;
...
public function __construct(User $user) { ... }
public function signIn( $token ) { ... $user->setUserId($id); ... }
public function register( $token ) { ... }
}
class Login_Email {
private $email;
public function __construct(User $user) { ... }
public function signIn( $email, $password) { ... $user->setUserId($id); ... }
public function register( $email, $password, $passport_number) { ... }
}
要不两次实现构造函数,您可以为其创建父类,甚至可以为该父类创建setUserId。但是登录过程不需要在用户类中,特别是如果过程可能不同。
为什么要将密码哈希存储在对象中?验证用户后,只需设置其用户ID,稍后就不需要密码哈希了。