You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何读取Session中存储的多个对象的指定属性?

报错原因

存储Log对象到Session时你手动调用了serialize()把对象转成了序列化字符串,但遍历输出时没有做反序列化处理,循环中拿到的$log是字符串类型,直接访问people属性就会触发Warning: Attempt to read property "people" on string警告。

修复方法

二选一即可:

方案1:删除存储时的手动serialize调用(推荐)

PHP Session本身会自动对存入的所有值做序列化、反序列化处理,不需要手动调用序列化函数,重复序列化反而会导致取值时拿到字符串。

  • 原错误写法:$_SESSION['logs'][] = serialize($log);
  • 修改为:$_SESSION['logs'][] = $log;

注意用这个方案的话,必须保证所有调用session_start()的页面(表单处理页、historiek.php展示页),都在session_start()执行前就引入了Log类的定义,否则反序列化时找不到类,会生成不完整对象导致属性访问失败。

方案2:保留手动序列化逻辑,遍历时增加反序列化步骤

如果业务上必须手动序列化存储,那遍历$_SESSION['logs']时,先把每个元素反序列化成Log对象再访问属性:

foreach ($_SESSION['logs'] as $logItem) {
    $log = unserialize($logItem);
    echo $log->people;
    // 按需输出$log->enter、$log->timestamp、$log->location等其他属性
}
排查兜底

如果修改后仍报同样错误,先打印整个$_SESSION['logs']数组检查内容:

var_dump($_SESSION['logs']);

确认数组元素里有没有混入其他脏数据,比如误存的表单字段字符串、提示文本等非Log序列化内容,这类无效值也会触发相同报错。

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:01:29