2

我有一个父类User,它有两个子类User_InstagramUser_Email. 我使用这些类来支持多种登录方法:用户可以选择使用 Instagram、电子邮件或两者都登录(一次使用电子邮件,然后使用 Instagram)。

该类User_Instagram包含 Instagram 特定的用户参数(如 InstagramUserId、Bio 等)。该类User_Email用于使用电子邮件/密码组合的典型注册。

我试图弄清楚如何以一种 OOP 投诉的方式实现这一点。我需要能够:

  1. User_Instagram->register($token)通过调用或注册用户User_Email->register($email,$password)
  2. 实例化一个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) { ... }
}

我最初认为工厂类可能在这里工作,但在那种情况下无法实例化父类。有任何想法吗?

4

1 回答 1

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,以后就不需要该密码哈希。

于 2013-04-06T11:37:43.533 回答