【问题标题】:Store Object in PHP Session在 PHP 会话中存储对象
【发布时间】:2017-12-06 20:36:36
【问题描述】:

在 PHP 中,将完整对象存储为会话变量是否被认为是最佳实践?

根据我的经验,有时有效,有时无效。有什么具体原因吗?

例子:

session_start();
$object = new sample_object();
$_SESSION['sample'] = $object;

【问题讨论】:

  • 如果对象是可序列化的,它应该可以正常工作。

标签: php oop serialization


【解决方案1】:

在存储对象之前在 PHP 中使用serialize(),并在从会话中检索对象时调用unserialize()

存储对象

session_start();
$object = new sample_object();
$_SESSION['sample'] = serialize($object);

检索对象

session_start();
$object = unserialize($_SESSION['sample']);

【讨论】:

  • 并且sample_object类必须在unserialize之前加载。
  • 是的,class 必须在unserialize() object 之前加载
【解决方案2】:

一般来说,最好的做法是根本不在会话中存储对象:D

我建议改为只存储数据。当您必须检查会话的当前状态时,它还有一个额外的好处是使调试过程更容易一些。

如果您想真正花哨,可以创建一个单独的data mapper,用于存储和检索会话中该特定类(或类组,具有相同接口)实例的数据。

【讨论】:

  • 然后你在用 getter 和 setter 检索存储的对象时失败了——这是一个代表你的数据模型的好结构。手动存储数据是繁琐且没有结构的。您必须要求会话类从必须映射到某处的特定键中获取值。映射您存储在会话中的所有键可以抽象到某个单独的注册表或其他任何东西,但这不只是需要一个对象类来映射您的属性和数据类型吗?在会话中序列化和反序列化对象非常轻松。
猜你喜欢
  • 2012-01-26
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多