【问题标题】:How should I design and use an User class?我应该如何设计和使用用户类?
【发布时间】:2014-01-10 13:04:45
【问题描述】:

当我从事过程 PHP 编程时,我会有一个登录页面,用户的会话将在其中创建和存储。然后,在每一页上,我只显示用户名并检索我需要的信息。

但是我很无奈,你在对象编程中是如何实现的呢?

所以,程序(login.php):

if ( $_POST['password'] != '' && $_POST['username'] != '' ) {
   // check if password&username combination exists in database etc.

   $_SESSION['user_id'] = $user_id;
   $_SESSION['username'] = $username;

}

我假设它会在 OOP 中这样做:

// include user class

if ( $_POST['password'] != '' && $_POST['username'] != '' ) {
   // check if password&username combination exists in database etc.

$user = new User();
$user->id = $userId;
$user->username = $username;

但问题是:我在哪里创建会话?而且这个对象不会存在于这个“login.php”页面之外,因为我在那里创建了它。如何让这些信息随处可见?

您如何使用特殊类(比如说 PDO)从数据库中获取信息,而不将查询放入用户类中?

非常感谢,我就是看不懂结构

【问题讨论】:

  • 除了下面的答案之外,如果这将成为一个包含许多不同文件的大型网站的一部分,我建议您通过自动添加一个“主文件”来开始每个脚本执行让您设置所需的一切,例如启动用户类(因此您不必在每个页面上重写代码)。如果允许您使用 apache 指令,请使用“auto_prepend_file”php 标志,否则在每个页面的顶部使用 require/include。

标签: php object pdo


【解决方案1】:

你会做一些类似的事情:

class User{

private $id;
private $username;

   function __construct($userId, $username) {
       $this->$id = $userId;
       $this->$username = $username;
   }

}

if ( $_POST['password'] != '' && $_POST['username'] != '' ) {
   // check if password&username combination exists in database etc.
   //......
   //Store your session
    $_SESSION['user_id'] = $user_id;
    $_SESSION['username'] = $username;
    //Create user instance
    $user = new User($user_id, $username ); 
}

您也可以将数据访问层放在用户构造函数中,这样您只需要担心存储 id 会话。

用户.php:

class User{

private $id;
private $username, $first_name, $last_name;

   function __construct($userId) {
       $this->$id = $userId;
       //get user data from db using $id
       $this->$username = $row['username'];
       $this->$first_name = $row['first_name'];
       $this->$last_name = $row['last_name'];
   }

}

登录.php:

function get_userId($username, $password)
 // check if password&username combination exists in database etc.
 //then return Id
 //......   
return $userId
}

然后使用如下函数:

if ( $_POST['password'] != '' && $_POST['username'] != '' ) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $user_id = get_userId($username, $password);
    $_SESSION['user_id'] = $user_id;
}

然后您将使用这样的 id 创建用户实例:

session_start();
$user_id = $_SESSION['user_id']; 
$user = new User($user_id); 

【讨论】:

    【解决方案2】:

    试试这个你就快到了

    // include user class
    session_start();
    
    if ( $_POST['password'] != '' && $_POST['username'] != '' ) {
       // check if password&username combination exists in database etc.
    
    $user = new User();
    $user->id = $userId;
    $user->username = $username;
    
    $_SESSION['user_obj'] = serialize($user);
    

    然后当你想在另一个页面再次访问它时:

    // include user class
    session_start();
    
    $user = new User();
    if ( isset( $_SESSION['user_obj'] ) {
        $user = unserialize($_SESSION['user_obj'];
    }
    

    【讨论】:

      【解决方案3】:

      首先需要使用官方documentation

      根据我的所有经验,我可以告诉您,只有您自己决定如何使用类和 OOP。有许多模型和标准可以为您提供一些结构,但这是个人选择。

      但在你的情况下,我可以建议你使用一个常规类来检查和存储信息。

      class User {
          private $id = null;
          private $username = null;
          private $isLoggedIn = false;
          public function __construct() {
              if (isset($_SESSION['userData']) && !empty($_SESSION['userData'])) { 
                   // I want to think that you have more complex check for user session
                   $this->id = $_SESSION['userData']['userId'];
                   $this->username = $_SESSION['userData']['username'];
                   $this->isLoggedIn = true;
              }
          }
      
          public function auth() {
              $_SESSION['userData'] = array()
              $result = false;
              // Here can be an password check
              if ($this->id && $this->username) { 
                   $_SESSION['userData']['userId'] = $this->id;
                   $_SESSION['userData']['username'] = $this->username ;
                   $this->isLoggedIn = true;
                   $result = true;
              }
              return $result;
          }
          public function isLoggedIn() {
              return $this->isLoggedIn;
          }
      
          public function userId($id = null) {
              if ($id != null) {
                   $this->id = $id;
              }
              return $this->id;
          }
      
          public function userName($name = null) {
              if ($name != null) {
                   $this->name = $name;
              }
              return $this->name;
          }
      
      }
      

      而且这个类的用法会很简单

      // include user class
      session_start();
      $user = new User();
      if ($user->isLoggedIn()) {
          // user is Logged In
      } elseif ( $_POST['password'] != '' && $_POST['username'] != '' ) { 
          // check if password&username combination exists in database etc.
      
          $user->userId($userId);
          $user->userName($username);
          $user->auth();
      } else {
          echo 'Auth failed';
          die();
      }
      echo 'Hello, ' . $user->userName();
      

      【讨论】:

        猜你喜欢
        • 2021-06-25
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 2017-04-01
        相关资源
        最近更新 更多