[英]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腳本中的第一件事。 此外, <?php
和session_start()
之間不得有任何echo語句或任何其他輸出生成函數。
如果在啟動會話之前確實必須生成輸出,則可以使用輸出緩沖 。
$_SESSION
很健忘。 在用戶一側不活動一段時間后,數據將被刪除。 警告:session_start():無法發送會話cookie - 已經發送的標頭(輸出開始於
發生這種情況的原因是由於PHP處理輸出的方式:它試圖盡可能快地向用戶輸出輸出。 但是,HTTP協議傳輸某些控制數據(cookie,會話屬於您等),在響應的所有輸出(“正文”)之前稱為“標題”。 只要輸出任何內容,標題就需要發送 - 除非您使用輸出緩沖。
我想我可以在那里看到你的思維模式,但你想要做的事情在很多方面都是錯誤的。
Singleton是一種反模式,應該不惜一切代價避免。 戈登看到了這個偉大的答案 。
您在PHP中所做的任何事情都無助於您在兩個請求中保留狀態。 您的$shoppingCart
是從頭開始為每個請求創建的,事實上,您的整個應用程序都是。 您不應該嘗試在對象中保留數據,而應該在每次請求后重新創建狀態,方法是從其他位置獲取相應的數據。 在您的示例中可能來自某種數據庫的nosql或sql。
您可以在超全局$_SESSION
保留用戶特定數據,但在大多數情況下,我建議不要使用它。 您的用戶會話應保存身份驗證和用戶數據,但您應避免在其中存儲與業務邏輯相關的所有類型的數據。
PHP不是應用程序服務器。 它不會在請求之間自動保持“應用程序”狀態。 您必須通過$ _SESSION,cookies和/或您自己的私有方法自己完成。
除非您采取措施保留數據,否則在調用腳本的HTTP請求結束時將清除應用程序的狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.