5

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

刷新页面时,我遇到了购物车不记得里面已经有什么的问题。

下面的代码是否有问题,或者我应该只使用全局变量还是 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(); 
4

3 回答 3

5

静态类成员(或任何其他变量)不会在不同的请求中保留。绝不。

救援会议

唯一的例外是$_SESSION;这是一种特殊的机制来实现这一点。

session_start()在脚本顶部为会话加注星标。

您现在可以$_SESSION像使用常规数组一样存储和检索信息。会话属于单个用户,它不是在所有用户之间共享数据的一种方式。

看看这里的介绍。

安静

session_start()在被调用之前你不能输出任何东西。也就是说,<?php必须是希望使用会话的 PHP 脚本中的确切第一件事。<?php此外,和之间不得有回声语句或任何其他输出生成函数session_start()

输出缓冲

如果您确实必须在开始会话之前生成输出,则可以使用输出缓冲

笔记

  • $_SESSION健忘。在用户方一段时间不活动后,数据将被删除。
  • 如果您收到以下错误消息,则表明您违反了上述准则。另一种可能性是您的脚本具有 BOM(Unicode 字节顺序标记)。如果是这样,请将其删除。

警告:session_start():无法发送会话 cookie - 标头已由(输出开始于

发生这种情况的原因是由于 PHP 处理输出的方式:它试图尽快将输出提供给用户。但是,HTTP 协议会在响应的所有输出(“正文”)之前传输某些控制数据(cookie、哪个会话属于您等),称为“标头”。只要您输出任何内容,就需要发送标头 - 除非您使用输出缓冲。

于 2012-07-24T14:42:02.843 回答
3

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

1. Singleton 不是一种模式,它是一种反模式

Singleton 是一种反模式,应该不惜一切代价避免使用。请参阅Gordon 的这个很好的答案,了解原因。

2. HTTP 是一种无状态协议。

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

3. 会议

您可以在 superglobal 中保留用户特定的数据$_SESSION,但在大多数情况下,我建议不要这样做。您的用户会话应该保存身份验证和用户数据,但您应该避免在其中存储与您的业务逻辑相关的各种数据。

于 2012-07-24T14:49:47.323 回答
1

PHP 不是应用服务器。它不会在请求之间自动保留您的“应用程序”状态。您必须自己通过 $_SESSION、cookie 和/或您自己的私有方法来执行此操作。

除非您采取措施保存数据,否则当调用脚本的 HTTP 请求结束时,应用程序的状态将被擦除。

于 2012-07-24T14:41:15.313 回答