通过使用静态变量和单例模式,我认为创建一个简单的购物车会很容易,它会在加载另一个页面时记住购物车中的商品。
我遇到的问题是刷新页面时购物车不记得其中已有的内容。
我下面的代码有问题吗?或者我应该只使用全局变量还是 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() http://www.php.net/manual/en/function.session-start.php在脚本的顶部。
您现在可以使用$_SESSION
就像存储和检索信息的常规数组一样。会话属于单个用户,它不是在所有用户之间共享数据的方式。
看一看here http://www.php.net/manual/en/session.examples.basic.php进行介绍。
Silence
之前不能输出任何内容session_start()
叫做。也就是说,<?php
必须是 PHP 脚本中希望使用会话的第一件事。此外,之间不能有 echo 语句或任何其他输出生成函数<?php
and session_start()
.
输出缓冲
如果您确实必须在启动会话之前生成输出,您可以使用输出缓冲 http://php.net/manual/en/function.ob-start.php.
Notes
-
$_SESSION
是健忘的。经过一定的time http://www.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime如果用户不活动,数据将被删除。
- 如果您收到以下错误消息,则表明您违反了上述准则。另一种可能性是您的脚本具有 BOM(Unicode 字节顺序标记)。如果是这样,请将其删除。
警告:session_start():无法发送会话 cookie - 标头已经存在
发送者(输出开始于
发生这种情况的原因是 PHP 处理输出的方式造成的:它试图尽快向用户提供输出。然而,HTTP 协议在响应的所有输出(“正文”)之前传输某些控制数据(cookie、哪个会话属于您等),称为“标头”。一旦输出任何内容,就需要发送标头 - 除非您使用输出缓冲。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)