php单例模式多请求中,PHP中的单例模式…如何在请求之间保存状态

通过使用静态变量和单例模式,我认为创建一个简单的购物车很容易,记住了当另一个页面被加载时,购物车中的哪些项目.

我有一个问题,购物车在刷新页面时不记得已经存在的东西.

我的代码是否有问题,或者我应该使用全局或mysql数据库.

存储状态的最佳方法是什么?

//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();

解决方法:

我想我可以在那里看到你的思维模式,但你想要做的事情在很多方面都是错误的.

单身人士不是一个模式,它是一个反模式

Singleton是一种反模式,应该不惜一切代价避免.有关原因,请参阅Gordon的this great answer.

2. HTTP是无状态协议.

您在PHP中所做的任何事情都无助于您在两个请求中保留状态.您的$shoppingCart是从头开始为每个请求创建的,事实上,您的整个应用程序都是.您不应该尝试在对象中保留数据,而应该在每次请求后重新创建状态,方法是从其他位置获取相应的数据.在您的示例中可能来自某种数据库的nosql或sql.

3.会议

您可以在超全局$_SESSION中保留用户特定数据,但在大多数情况下,我建议不要使用它.您的用户会话应保存身份验证和用户数据,但您应避免在其中存储与业务逻辑相关的所有类型的数据.

标签:php,design-patterns,singleton

来源: https://codeday.me/bug/20190725/1538055.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值