5

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

因此,在这个 Login 类中,有验证方法等,但到了有会话验证的地步,在构造中给出了 before 参数,它不能被使用(至少在这个类范围内):

    $this->_username = ($this->_login)? $this->filter($_POST['username']) : $_SESSION['username'];
    $this->_password = ($this->_login)? $this->filter($_POST['password']) : '';
    $this->_passmd5 = ($this->_login)? md5($this->_password) : $_SESSION['password'];

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

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

4

3 回答 3

4

我不确定你真的想要一个“登录”课程。你可能会做这样的事情

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;
   }

}

登录.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';

注销.php

Session::destroyUserSession();

这种设计可能不是最好的方法,但可能会给你一个想法。

于 2012-06-27T22:54:14.710 回答
3

“我已经按照 youtube 上的教程进行操作”是第一个问题。仅您粘贴的三行代码就表明您观看的视频是由业余 PHP 开发人员创建的。

“所以我的问题是 - 设计是否正确,我应该如何构建登录系统的其余部分”

由于只贴了三行,不知道设计对不对。我敢打赌那不是。

何时使用对象的一个​​好的经验法则是,当代码明显先进到需要两个以上的函数时,将在应用程序的多个位置使用,并且如果代码不存在命名冲突的可能性很大。 t 封装在对象或命名空间中。这不符合该标准 - 登录和注册屏幕各有一个页面(最多),因此该代码将被使用一次。没有理由封装该逻辑。Niko 提到了 Session 和 User 类,它们是常见的模式,可以封装。

至于构建登录系统,它们很快变得复杂,并且这些天几乎是专业化的。我建议阅读以下 SO wiki 文章:

基于表单的网站身份验证权威指南

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

http://barebonescms.com/documentation/sso/

SSO 客户端不向应用程序提供类 - 只是一组函数,例如 SSO_LoggedIn()、SSO_Login()、SSO_Logout() 等。当更简单的事情就足够了时,为了执行 OOP 而执行 OOP 是错误的编写软件的方法。有时功能更好。有时内联代码会更好。这真的取决于,需要多年的经验才能洞察什么是最好的方法。

于 2012-06-28T14:07:42.500 回答
0

$_SESSION['password']

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

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

于 2017-06-22T11:05:06.593 回答