2016-02-12 50 views
0

我的一位同事搬到了另一家公司,我得到了他現有項目的源代碼。 我很震驚代碼看起來有多混亂。我不是一個PHP開發人員,所以也許這是一個愚蠢的問題,但在我看來,他太多地使用了$_SESSION,我們在Sessions中遇到了很多錯誤。我想知道封裝$_SESSION是否好,併爲每個值使用自己的方法編寫。封裝PHP會話

我這個代碼中看到的問題是,他使用的會話對象這樣

$_SESSION['customer']['items'] = getItems() //returns an array 
$_SESSION['article'][$Id]['name'] = utf8_decode[$received[1]]; 

所以從我的角度來看我將自己所有的東西存放在簡單Popos,並把那些到會話中。

所以婆婆對客戶應該是這樣

class CustomerPopo 
{ 

    private $_id; 

    private $_salutation; 

    private $_name; 

    private $_surename; 

     public function getId() 
    { 
     return $this->_id; 
    } 

    public function setId($value) 
    { 
     $this->_id = $value; 
    } 

    public function getSalutation() 
    { 
     return $this->_salutation; 
    } 

    public function setSalutation($value) 
    { 
     $this->_salutation = $value; 
    } 

    public function getName() 
    { 
     return $this->_name; 
    } 

    public function setName($value) 
    { 
     $this->_name = $value; 
    } 

    public function getSurename() 
    { 
     return $this->_surename; 
    } 

    public function setSurename($value) 
    { 
     $this->_surename = $value; 
    } 

    function CustomerPopo() { 

    } 
} 

我想象中的SessionManager這樣

class SessionManager 
{ 

    private static function getValue($valueName) 
    { 
     $value = SessionManager::getValueFromSession($valueName); 
     if (is_null($value)) { 
      //Handle stuff and do further checks 
     } 
     return $value; 
    } 

    private static function getValueFromSession($valueName) 
    { 
     $value = null; 
     if (isset($_SESSION[$valueName])) { 
      $value = $_SESSION[$valueName]; 
     } 
     return $value; 
    } 

    private static function setValue($valueName, $value) 
    { 
     $_SESSION[$valueName] = $value; 
    } 

    private static function clearValue($valueName) 
    { 
     if (isset($_SESSION[$valueName])) { 
      unset($_SESSION[$valueName]); 
     } 
    } 

    public static function getCustomer() 
    { 
     $customer = ''; 
     try { 
      $customer = SessionManager::getValue('customer'); 
     } catch (Exception $e) { 
      $customer = ''; 
     } 
     return $customer; 
    } 

    public static function setCustomer($customer) 
    { 
     SessionManager::setValue('customer', $customer); 
    } 
} 

有了這個,我會殺了一些來自不同的拼法其中出現的錯誤客戶/客戶/客戶這個詞。 我想象SessionManager會變得很大,因爲我們在代碼中有~30個會話變量。

是否有一個設計模式,我可以按照實現這樣一個SessionManager,而不會讓它變得更糟?如我所說,我不是很熟悉PHP(還)。

編輯

由於這種方法似乎我怎麼能處理30個Session變量我提到的是有效的?如果我有一組/得到,也許每個值一個明確的方法,我將結束與60-90方法

回答

1

它是有一個對象封裝訪問全局變量,如$_SERVER$_GET$_POST一個好主意或者如你的例子中的$_SESSION。在MVC架構中這是常見的做法。

該類應該具有IDE完成的方法嗎?這實際上取決於你,但在我工作的工作場所中的普通做法是不要讓他們,而是使字段的字符串標識符const代替,然後用於通過對象來指定全局變量$_SESSION中的索引,例如SessionManager

但即使如此,我可能會拋棄靜態方法,並改爲使用經理實例。擁有靜態方法的類可以防止錯別字,但不能解決全局狀態問題,當單元測試應用程序時這可能是一個巨大的問題。

+0

我會看看我如何更改代碼,以便我不使用靜態方法 – Bongo

1

我完全同意像使用$ _SESSION那樣使用$ _SESSION是很麻煩的,因爲你很難找出實際存儲在會話中的內容。

在我看來,CustomerPopo是一個非常好的主意,因爲它很容易理解可用數據。此外,IDE將能夠理解它並將這些信息作爲代碼完成和檢查提供給您。

我也喜歡你的SessionManager,但我會嘗試擺脫這些getValue/setValue函數並移動像getCustomer/setCustomer這樣的詳細函數。 我想你沒有使用PHP框架。我想你應該看看它們,它們非常方便(例如Symfony或Yii2)。

最後一件事:永遠記住,存儲在會話對象中的所有數據都會爲每個請求加載和解析,但是如果您使用它或不使用它。因此,如果您存儲大量僅用於特定請求的數據,則應考慮使用其他位置來存儲它,如外部緩存。 另外,會話引入了狀態,如果可能的話,應該避免使用狀態。

+0

getValue,setValue函數是私有的,並由getCustomer和setCustomer使用,以便我不必編寫所有該錯誤處理代碼超過一次。你會如何做到這一點? – Bongo

+0

哦,對不起,我沒有看到。在這種情況下,我沒有看到任何問題... –