php中面向对象登录系统的类设计

php中面向对象登录系统的类设计,php,oop,login-system,Php,Oop,Login System,在建立网站时,我已经开始通过解决一些比较简单的问题来提高我的OOP技能。所以它从一个登录系统开始,我跟随youtube上的一个教程,帮助我制作了一个登录类,但随着它的发展,它引起了很多疑问(顺便说一句,代码是100行,所以我将继续粘贴它) 因此,在这个登录类中,有一些验证方法等,但它涉及到会话验证,即在构造中使用给定的before参数时,它不能被使用(至少在这个类范围内): 所以在这种情况下,当没有设置会话变量时,我不能使用verifySession()方法(例如,区分登录用户在主页上应该看到的

在建立网站时,我已经开始通过解决一些比较简单的问题来提高我的OOP技能。所以它从一个登录系统开始,我跟随youtube上的一个教程,帮助我制作了一个登录类,但随着它的发展,它引起了很多疑问(顺便说一句,代码是100行,所以我将继续粘贴它)

因此,在这个登录类中,有一些验证方法等,但它涉及到会话验证,即在构造中使用给定的before参数时,它不能被使用(至少在这个类范围内):

所以在这种情况下,当没有设置会话变量时,我不能使用verifySession()方法(例如,区分登录用户在主页上应该看到的内容)


所以我的问题是——设计正确吗,我应该如何构建其余的登录系统:在每个页面上进行loggedIn验证和注销——它们中的每一个是否都在单独的类中(以及在特定类中重复的方法如何,我是否应该始终继承它们)。我意识到OOP有不同的方法,但是作为一个初学者,我应该遵循什么特别的方法(这将帮助我更好地理解OOP)。

我不确定你是否真的想要一个“登录”类。 你可以这样做

class User
{
   private $username;
   private $password;

   public function __construct($username)
   {
     //load this user object here
   }

   private function hashPassword($password)
   {
      ///Dont do this has the hash, but im just keeping it simple
      return md5($password . 'a}{!@#' . $this->username);

   }

   public function authenticate ($password)
   {
      return $this->hashPassword($password) == $this->password;
   }

}
login.php

$user = new User($_POST['username']);
if($user->authenticate($_POST['password']))
{
 //do session initilization here (can be a class, or whatever)
 Session::createUserSession($user)
}
else
 echo 'bad login';
logout.php

Session::destroyUserSession();
这种设计可能不是最好的方式,但可能会给你一个想法。

“我在youtube上学习了一个教程”是第一个问题。仅粘贴的三行代码就表明您观看的视频是由业余PHP开发人员创建的

“所以我的问题是——这个设计正确吗?我应该如何建造 “登录系统的其余部分”

因为只贴了三行,我不知道设计是否正确。但我敢打赌,情况并非如此

关于何时使用对象,一个好的经验法则是当代码显然足够高级,需要两个以上的函数,将在应用程序中的多个位置使用,并且如果代码未封装在对象或命名空间中,则可能会出现命名冲突。这不符合标准-登录和注册屏幕每个页面(最多)一页,因此该代码将使用一次。没有理由封装这种逻辑。Niko提到了会话和用户类,它们是常见的模式,可以封装

至于建立一个登录系统,它们变得很复杂,而且现在几乎是一个专业化的问题。我建议阅读以下SO wiki文章:

如果您想要一个遵循上述wiki文章的预打包系统,您可以查看:


SSO客户端不向应用程序提供类-只是一组函数,如SSO_LoggedIn()、SSO_Login()、SSO_Logout()等。在编写软件时,只为执行OOP而执行OOP是错误的。有时功能更好。有时内联代码更好。这真的要看情况而定,需要多年的经验才能洞察最佳方法。

$\u SESSION['password']

在会话中不需要存储密码(纯文本?)。 您应该检查是否允许用户登录,如果允许并提供了正确的密码,您在会话中存储的内容不会超过“已登录”。为方便起见,您还可以存储用户id的用户名


但是,将密码与数据库中的密码进行比较后,就不需要密码了。

我不太明白您在这里提出的问题(您可以澄清一下吗?),但总的来说:在类中遵循原始概念和模型(现实世界)通常是一个好主意。“登录”不是一件事,但会话和用户才是。我正在寻找一个、、模式“”来构建面向对象的登录系统(登录、注销,如果用户登录每个页面),我不确定所有这些东西是否都应该在一个类中。这就是为什么我在努力,有很多方法可以解决这个问题,但是我不能决定该走哪条路。谢谢,这真的很有帮助,很抱歉这个问题不够精确,需要很多代码才能使它足够精确。
Session::destroyUserSession();