
本文详解如何安全地将对象存入 PHP Session 并遍历显示其 name 属性,重点解决因序列化/反序列化缺失导致的“Attempt to read property 'name' on string”错误。
本文详解如何安全地将对象存入 php session 并遍历显示其 `name` 属性,重点解决因序列化/反序列化缺失导致的“attempt to read property 'name' on string”错误。
你在 data.php 中直接使用 $log->name 报错的根本原因在于:你将对象序列化后存入 Session(serialize($new_log)),但读取时未执行反序列化操作。此时 $_SESSION['logs'] 中存储的是字符串(序列化后的文本),而非原始对象,因此 $log 是一个字符串,无法访问其 ->name 属性。
✅ 正确做法:存取全程保持对象完整性
1. 存储时不序列化(推荐方案)
PHP 的 $_SESSION 原生支持对象存储(前提是类已定义且自动加载或已声明),无需手动 serialize():
// 在 index.php 中(提交处理部分)
if (isset($_POST['submit'])) {
session_start();
$new_log = new Log();
$new_log->name = $_POST['name'] ?? '';
$new_log->location = $_POST['location'] ?? '';
$new_log->activity = $_POST['activity'] ?? '';
// ✅ 直接追加对象(无需 serialize)
$_SESSION['logs'][] = $new_log;
header('Location: data.php');
exit;
}
2. 读取时直接访问属性
此时 $_SESSION['logs'] 是一个对象数组,可直接遍历:
<!-- data.php -->
<?php session_start();
// 确保 logs 存在且为数组
if (isset($_SESSION['logs']) && is_array($_SESSION['logs'])) {
foreach ($_SESSION['logs'] as $log) {
// ✅ $log 是 Log 实例,可安全访问 public 属性
echo htmlspecialchars($log->name) . "<br>";
}
} else {
echo "暂无日志数据。";
}
?>
⚠️ 注意:务必在 data.php 开头调用 session_start(),且确保 Log 类已在该文件或通过 require_once 加载(否则反序列化可能失败)。
3. 若必须使用序列化(不推荐,仅作了解)
若因历史原因需序列化,则读取时必须反序列化:
// 存储(不推荐)
$_SESSION['logs'][] = serialize($new_log);
// 读取(需反序列化)
foreach ($_SESSION['logs'] as $serialized_log) {
$log = unserialize($serialized_log); // ❗关键步骤
if ($log instanceof Log) {
echo htmlspecialchars($log->name) . "<br>";
}
}
但此方式易引发安全风险(如反序列化漏洞)且性能更低,强烈建议避免。
? 安全与健壮性增强建议
- 使用 htmlspecialchars() 输出用户输入内容,防止 XSS;
- 添加空值判断(?? '')和类型校验(instanceof Log);
- 初始化 Session 数组(如 $_SESSION['logs'] = $_SESSION['logs'] ?? [];)避免 Notice 错误;
- 类定义建议放在独立文件(如 Log.php)并统一引入,保证类定义始终可用。
通过以上调整,即可稳定、安全地展示每个日志对象的 name 属性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











