PHP:将“对象”存储在 $_SESSION

2022-08-30 06:25:35

我刚刚发现我实际上可以将对象存储在$ _SESSION中,我发现它非常酷,因为当我跳到另一个页面时,我仍然有我的对象。现在,在我开始使用这种方法之前,我想了解它是否真的是一个好主意,或者是否存在潜在的陷阱

我知道,如果我有一个单一的入口点,我就不需要这样做,但我还没有,所以我没有一个单一的入口点,我真的很想保留我的对象,因为我不会像那样失去我的状态。(现在我也读到我应该对无状态站点进行编程,但我还不理解这个概念。

简而言之:会话中存储对象可以吗,它有什么问题吗?


编辑:

临时摘要:到目前为止,我明白了,即使对象涉及再次查询数据库,重新创建对象也可能更好。

进一步的答案也许可以更详细地阐述这一方面


答案 1

我知道这个话题已经很老了,但这个问题不断出现,并没有得到令我满意的解决:

无论您是将对象保存为 _SESSION 美元,还是根据隐藏表单字段中存储的数据将它们重建为整个布料,或者每次都从数据库中重新查询它们,您都在使用 state。HTTP是无状态的(或多或少;但请参阅GET与PUT),但几乎所有任何人都想与Web应用程序有关的事情都需要在某个地方维护状态。表现得好像把国家推入角落和缝隙相当于某种理论上的胜利是错误的。状态就是状态。如果使用 state,则会失去通过无状态获得的各种技术优势。这不是一件失眠的事情,除非你事先知道你应该因此而失眠。

我对汉克·盖伊(Hank Gay)提出的“双重打击”论点所获得的祝福感到特别困惑。OP是否正在构建分布式和负载平衡的电子商务系统?我的猜测是否定的。我将进一步假设,序列化他的$User类,或者其他什么,不会使他的服务器瘫痪得无法修复。我的建议是:使用对您的应用程序明智的技术。$_SESSION中的对象很好,但要遵守常识性的预防措施。如果您的应用程序突然变成在流量方面与亚马逊相媲美的东西,您将需要重新适应。这就是生活。


答案 2

只要在进行session_start()调用时,PHP已经遇到类声明/定义,或者可以通过已安装的自动加载器找到,就可以了。否则,它将无法从会话存储区反序列化对象。


推荐