簡體   English   中英

使用對象與常規變量在會話中存儲用戶信息

[英]Storing user info in a session using an object vs. normal variables

我正在為我的網站實施用戶身份驗證系統。 我正在使用一個開源庫,通過創建一個User對象並將該對象存儲在我的php SESSION變量中來維護用戶信息。 這是存儲和訪問該信息的最佳方式嗎?

我發現訪問用戶變量有點麻煩,因為我必須首先創建一個對象來訪問它們:

$userObj = $_SESSION['userObject'];
$userObj->userId;

而不是像這樣只訪問用戶ID,我通常會存儲用戶ID:

$_SESSION['userId'];

將一堆用戶數據存儲為對象而不是僅將它們存儲為單獨的SESSION變量是否有優勢?

ps - 庫似乎也在用戶對象(id,用戶名,加入日期,電子郵件,最后一個用戶數據庫查詢)中存儲了一些變量,但我真的不在乎將所有信息存儲在我的會話中。 我只想保留用戶ID和用戶名。

我認為邏輯上將相關數據分組在一個密鑰下是最好的,它將相關數據與一個共同的父親耦合,它還為你提供了更多關於鍵名的空間,所以你可以有$_SESSION['user']->id$_SESSION['user_id'] ,允許您擁有屬性名稱上下文 ,因此您不必像使用user_*鍵那樣在鍵名中提供上下文

我還認為這里有一個更大的概念,當你使用user_*你幾乎都說任何鍵名為user_*都會與用戶相關聯。 這不是組織IMO對象的好方法。 但是,當您使用user密鑰並將其下面的所有相關數據粘貼時,您可以獲得更清晰的頂級和真正的嵌套數據層次結構,而不是線性數據層次結構。

為什么不創建一個處理數據訪問和存儲的會話包裝類? 這將產生更清晰的代碼和抽象,因此對存儲方法的更改非常簡單。

這是一個包裝器的例子:

abstract class Session
{
     private static $_started = false;
     private static $_driver;

     public static function start($driver = "native", $site = "default")
     {
         if(self::$_started === false)
         {
             require_once "drivers/" . $driver . ".php";
             self::$_driver = new $driver($_site);
         }
     }

     public static function set($key,$value)
     {
          self::$_driver->set($key,$value);
     }

     public static function get($key)
     {
          self::$_driver->get($key);
     }

     public static function remove($key)
     {
          self::$_driver->remove($key);
     }
}

以上只是簡單但你應該明白,你還必須創建具有所需方法集的本機驅動程序文件,並且它們應該相應地存儲會話數據。

使用Session類的示例如下:

Session::start("native");

    /*
        * Generic Code
    */

Session::set("key","value (:");

在獲取“用戶”對象時,您可以像這樣簡單:

Session::get("userObj")->id;

產生更清晰的代碼和更大的范圍問題。

經過一段時間后,您可以創建一個新的驅動程序,用於存儲在數據庫中,然后只需將驅動程序從本機更改為數據庫。

注意:在數據庫中存儲對象可能有點小問題,特別是如果您的代碼沒有被組織為在用戶類在范圍之前加載會話,那么您可以在會話中獲得部分對象,這將導致缺乏功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM