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
相关产品推荐
相关产品推荐

