实现支持多种登录方法的用户类

时间:2013-04-06 09:18:47

标签: php oop inheritance

我的父类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. 注册用户
  3. 实例化User课程,以便能够访问一般用户信息(例如$userid)并了解他登录的服务(电子邮件,Instagram或两者)。
  4. 我目前实施的方式有点难以维护 - 而且我很确定这是完全错误的(称之为直觉)。

    当前班级结构

    父类

    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类可能在这里工作,但是在该场景中无法实例化父类。有什么想法吗?

1 个答案:

答案 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,稍后就不需要密码哈希了。