簡體   English   中英

PHP中的單例模式...如何在請求之間保存狀態

[英]Singleton Pattern In PHP… How Can I Save State Between Requests

通過使用靜態變量和單例模式,我認為創建一個簡單的購物車很容易,記住了當另一個頁面被加載時,購物車中的哪些項目。

我有一個問題,購物車在刷新頁面時不記得已經存在的東西。

我的代碼是否有問題,或者我應該使用全局或mysql數據庫。

存儲狀態的最佳方法是什么?

<?php
//create a singleton class
class shoppingCart {

    private static $_shoppingCartItems = array();
    private static $_instance = null;

    private function __construct(){

    }

    public static function getInstance(){
        if(self::$_instance == null)
            self::$_instance = new shoppingCart();
        return self::$_instance;            
    }


    public function add(ShoppingItem $item){
        $this->_shoppingCartItems[] = $item;
    }

    public function cartCount(){                 
        return count($this->_shoppingCartItems);
    }  
}
?>

履行

$item = new shoppingItem();

$shoppingCart = shoppingCart::getInstance();
$shoppingCart->add($item);
$shoppingCart->add($item);

//should increment by 2 on each page load but it doesn't
echo $shoppingCart->cartCount(); 

不會在不同的請求中保留靜態類成員(或任何其他變量)。 決不。

會議拯救

唯一的例外是$_SESSION ; 這是一種允許這種情況的特殊機制。

使用腳本頂部的session_start()為會話session_start()星標。

您現在可以像常規數組一樣使用$_SESSION來存儲和檢索信息。 會話屬於單個用戶,它不是跨所有用戶共享數據的方法。

看看這里的介紹。

安靜

在調用session_start()之前,不得輸出任何內容。 也就是說, <?php必須是希望使用會話的PHP腳本中的第一件事。 此外, <?phpsession_start()之間不得有任何echo語句或任何其他輸出生成函數。

輸出緩沖

如果在啟動會話之前確實必須生成輸出,則可以使用輸出緩沖

筆記

  • $_SESSION很健忘。 在用戶一側不活動一段時間后,數據將被刪除。
  • 如果您收到以下錯誤消息,則違反了上述准則。 另一種可能性是您的腳本具有BOM(Unicode字節順序標記)。 如果是這樣,請將其刪除。

警告:session_start():無法發送會話cookie - 已經發送的標頭(輸出開始於

發生這種情況的原因是由於PHP處理輸出的方式:它試圖盡可能快地向用戶輸出輸出。 但是,HTTP協議傳輸某些控制數據(cookie,會話屬於您等),在響應的所有輸出(“正文”)之前稱為“標題”。 只要輸出任何內容,標題就需要發送 - 除非您使用輸出緩沖。

我想我可以在那里看到你的思維模式,但你想要做的事情在很多方面都是錯誤的。

單身人士不是一個模式,它是一個反模式

Singleton是一種反模式,應該不惜一切代價避免。 戈登看到了這個偉大的答案

2. HTTP是無狀態協議。

您在PHP中所做的任何事情都無助於您在兩個請求中保留狀態。 您的$shoppingCart是從頭開始為每個請求創建的,事實上,您的整個應用程序都是。 您不應該嘗試在對象中保留數據,而應該在每次請求后重新創建狀態,方法是從其他位置獲取相應的數據。 在您的示例中可能來自某種數據庫的nosql或sql。

3.會議

您可以在超全局$_SESSION保留用戶特定數據,但在大多數情況下,我建議不要使用它。 您的用戶會話應保存身份驗證和用戶數據,但您應避免在其中存儲與業務邏輯相關的所有類型的數據。

PHP不是應用程序服務器。 它不會在請求之間自動保持“應用程序”狀態。 您必須通過$ _SESSION,cookies和/或您自己的私有方法自己完成。

除非您采取措施保留數據,否則在調用腳本的HTTP請求結束時將清除應用程序的狀態。

暫無
暫無

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

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