PHP 中的单例模式...如何在请求之间保存状态

2024-01-11

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

我遇到的问题是刷新页面时购物车不记得其中已有的内容。

我下面的代码有问题吗?或者我应该只使用全局变量还是 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(使用前将#替换为@)

PHP 中的单例模式...如何在请求之间保存状态 的相关文章

  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • Smarty 3 或更早版本中有类似 Dwoo-s {with} 或 {loop} 的东西吗?

    Dwoo 模板引擎中的 with 和 loop 插件更改变量名称解析的默认上下文 如果在 Dwoo 中您提供模板 arr foo with arr foo arr foo with 有数据 array arr gt array foo gt
  • 使用 strtotime() 计算时间差(以小时和分钟为单位)[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions time1
  • 如何防止 CakePHP 中重复表单提交?

    我发现 CakePHP 中的安全组件通过将令牌作为隐藏值添加到表单中来帮助防止 CSRF 我想知道是否有办法防止使用此组件或其他组件 帮助器重复表单提交 在之前的项目中 我使用了保存在会话中的唯一哈希值 该哈希值会在提交时读取并删除 重复提
  • 在 Kohana 中,可以触发 404 错误吗?

    我有一个名为articles 它创建从数据库获取相关数据的文章模型 我想 如果我调用的方法返回false 触发 404 错误 这是我到目前为止所拥有的 articleName this gt uri gt segment articles
  • PMA 4.5.2.0 file_exists():open_basedir 限制生效

    从 PPA 在我的 Ubuntu 服务器上安装 phpMyAdmin 后 https launchpad net nijel archive ubuntu phpmyadmin https launchpad net nijel archi
  • 通过jquery传递搜索参数

    我有一个表单 如果用户输入搜索查询 其参数应通过 jquery 传递 并在获取结果后将结果加载到 div 容器中 由于我不太熟悉 jquery 我该怎么做 html currently the data is being displayed
  • 使用 PhpStorm 删除 CakePHP 中的插件后出现“成员有私人访问错误”

    从我的 CakePHP 框架中删除插件以及与其关联的所有代码行后 我在以下位置收到错误getInitializer的功能autoload static php in my vendor gt composer folder public s
  • Ubuntu 18.04升级后php7.2-curl无法安装

    今天从 16 04 升级到 18 04do release upgrade d 在升级过程中 我被告知一些软件包将被删除 其中包括 删除 libperl5 22 lxc common perl modules 5 22 php imagic
  • 如何比较两个字符串的大小写和变音符号不敏感?

    我有两根弦 字符串 1 塞巴斯蒂安 字符串 2 塞巴斯蒂安 我想通过忽略 重音 字符来比较这两个字符串 谁能知道这个逻辑吗 提前致谢
  • 使用 HTTP-Basic 身份验证发出 HTTP GET 请求

    我需要为我正在开发的 Flash Player 项目构建一个代理 我只需要使用 HTTP Basic 身份验证向另一个 URL 发出 HTTP GET 请求 并提供来自 PHP 的响应 就好像 PHP 文件是原始源一样 我怎样才能做到这一点
  • Facebook 中用户的时区是如何编码的

    我需要检查用户的时区 但我找不到它的真正定义 参考API http developers facebook com docs reference api user says 用户的时区与 UTC 的偏移量 现在在维基百科上这些是可能的时区
  • Facebook Graph API v3.1 开发人员访问令牌权限限制

    如您所知 Facebook 将其 API 升级到了 V3 1 现在正在慢慢地淘汰旧的 API 和应用程序 因此我们必须迁移到新的 API 他们做出了一些艰难的决定 这对垃圾邮件网站来说是好事 但对开发人员来说也很难 提醒 Graph API
  • PHP/MySQL:如何在网站中创建评论部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我不会问 如何使用 PHP MySQ
  • Opencart最低下单价不包括一类

    我正在使用 opencart 并成功为所有交易添加了最低订单价格 这是我使用的代码 div div div class warning Minimum 10 Euro to checkout div 现在我想从中排除一个类别 以便可以购买该
  • 使用php将文本文件转换为xml?

    data txt ha15rs 250 home2 gif 2 ha36gs 150 home3 gif 1 ha27se 300 home4 gif 4 ha4678 200 home5 gif 5 我想使用 php 使用 simplex
  • 池和集群之间的区别

    从最纯粹的角度来看 它们感觉像是相同的概念 两者都管理资源 节点集并控制来自外部组件或由外部组件进行的访问 通过池 您可以向池借用这些资源 节点 也可以从池中归还这些资源 节点 对于集群 您在资源 节点前面有一个负载均衡器 并且您可以向负载
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • Laravel - 覆盖模型 ID

    我正在开发电子书管理系统 我使用 UUID 而不是自动递增整数主键 它工作得很好 protected static function boot parent boot static creating function model model
  • 如何使用 PHP 从 MySQL 检索特定值?

    好吧 我已经厌倦了 过去一周我花了大部分空闲时间试图解决这个问题 我知道 SQL 中的查询已更改 但我无法弄清楚 我能找到的所有其他帖子似乎都已经过时了 如果有人能帮助我 我将非常感激 我想做的就是使用手动输入数据库的唯一 密码 来检索行的

随机推荐

  • 不需要的 onItemSelected 调用

    我有 36 个微调器 我已经用一些值初始化了它们 我已经与他们一起使用了 onItemSelectedListener 像往常一样 用户可以与这些旋转器交互 触发 onItemSeected 函数 一个问题是调用是在 init 期间进行的
  • 无法让 Swagger UI 与 Spring boot 一起使用

    我正在尝试让 Swagger UI 与 Spring Boot 1 2 1 一起使用 我按照以下说明进行操作https github com martypitt swagger springmvc https github com mart
  • Thrift - 每个 Socket 都有不同的 Handler 实例

    我正在 Thrift 中开发一个 代理 服务器 我的问题是 传入代理的每个连接都使用相同的处理程序实例 代理的客户端实现位于处理程序中 因此所有客户端都通过同一连接与终端服务器进行通信 我有 n 个客户端 gt n 个套接字 gt 1 个处
  • Android Studio 操作栏颜色未改变

    在 styles xml 中运行 Android 5 0 lollipop
  • 搜索引擎 Lucene 与数据库搜索

    我正在使用 MySQL 数据库 并且一直在使用数据库驱动的搜索 数据库引擎和Lucene搜索引擎有何优缺点 我想获得有关何时何地使用它们的建议 我建议你阅读全文搜索引擎与 DBMS https lucidworks com 2009 09
  • Unix 路径搜索 C 函数 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在编写 UNIX shell 程
  • 如何使用 awk、Perl 或 Python 挖掘 XML 文档?

    我有一个具有以下数据格式的 XML 文件
  • python 无法通过电子邮件发送附件文件

    我有以下代码 可以正常工作 但它不会发送附件文件 import smtplib import os from email mime multipart import MIMEMultipart from email mime text im
  • 如何确定 jQuery 中匹配元素的元素类型?

    我通过 ID 名称匹配 ASP Net 生成的元素 但我有一些元素可能根据页面上下文呈现为文本框或标签 我需要确定匹配的是文本框还是标签 以便知道是通过 val 还是通过 html 获取内容 id endOfIdToMatch each f
  • 对标准化数据的曲线拟合结果进行非标准化

    我正在拟合指数衰减函数lsqvurcefit in Matlab 为此 我首先正常化 http en wikipedia org wiki Standard score Standardizing in mathematical stati
  • mysql进程无法停止

    我最近在 Ubuntu 12 04 操作系统桌面上安装了 5 5 28 29 2 Percona Server GPL 版本 29 2 我尝试使用不同的方法停止服务器 sudo etc init d mysql stop sudo kill
  • 地址簿中记录的 ABRecordID(地址簿中插入记录的唯一 ID)

    我在向 iPhone 的联系人添加记录时遇到了困难 情况是这样的我有一个视图 其中创建联系人并将其插入到 iPhone 的联系人中 我想要的是 有没有办法找到插入的 记录 联系人的唯一 ID 在其他视图中访问联系人将需要它 请赐教我这一点
  • 如何在 IntelliJ IDEA 中选择骆驼化单词的单个单词

    IntelliJ IDEA 中移动或选择骆驼化单词的单个单词的快捷方式是什么 假设我有一个 LongMultiWordVariableName 我希望能够将光标移动到每个单词以进行编辑或选择变量的部分 Eclipse has a short
  • backbonejs + cors 和 save() 方法

    我正在尝试执行 POST 抛出保存方法 这是我的模型 app Models Dummy Backbone Model extend initialize function url http anotherdomain Hello 当我执行时
  • VSO(TFS) - 获取当前日期时间作为变量

    如何获取当前日期时间并将其作为变量传递给某些部署任务 您可以定义具有任意值的变量 然后将该变量修改为当前日期 详细步骤如下 在release中定义一个变量 Assume the variable name is time and we se
  • solrj:添加后需要显式提交吗?

    我正在使用solrClient add SolrInputDocument doc 将文档逐一添加到我的方法solr 之后我明确地打电话solrClient commit 是必须的吗 我见过一些add方法 它指定一个delay for co
  • Pandas 根据列的值有效地分块读取大型面板 CSV

    我有一个很大的 CSV 文件 磁盘上约 50 GB 但无法立即将其完全读入内存 数据集本身是面板数据 看起来像 ID Time Col 1 Col N 1 2000 1 1 1 2000 1 2 2 2000 1 1 我加载这些数据的想法是
  • 为什么我的图标没有出现在标题栏中?

    我已从 Visual Studio 解决方案资源管理器的 属性 窗口为我的应用程序分配了一个图标 应用程序的图标更改成功 但标题栏仍显示默认图标 我已经重建了我的应用程序 但它仍然显示默认图标 我究竟做错了什么 因为公司的图标配置与应用程序
  • 将 Y 轴放在热图的左侧?

    如何制作 Y 轴标签位于左侧的热图 好像默认是右边的 我需要使用自定义轴吗axis In the heatmap函数轴的位置是硬编码的 但只需更改一个数字即可将其定位在另一侧 这将非常容易 在控制台中输入 heatmap 然后将第二个参数从
  • PHP 中的单例模式...如何在请求之间保存状态

    通过使用静态变量和单例模式 我认为创建一个简单的购物车会很容易 它会在加载另一个页面时记住购物车中的商品 我遇到的问题是刷新页面时购物车不记得其中已有的内容 我下面的代码有问题吗 或者我应该只使用全局变量还是 mysql 数据库 存储状态的