PHP存储对象到Session报访问不完整对象属性错误解决方法
报错:The script tried to access a property on an incomplete object
错误触发场景
将自定义类Person的实例存入Session后,跳转至列表页遍历Session中的对象、访问对象属性时触发报错,报错截图如下:
产生原因
PHP存储对象到Session时会自动对对象做序列化处理,读取Session时会自动反序列化还原对象。反序列化对象的核心前提是:调用session_start()启动Session前,当前脚本环境中已经加载了对应类的定义。
当前代码的核心问题是:列表读取页list.php中直接调用session_start(),没有提前加载Person类定义,PHP无法还原Person类实例,只能把反序列化失败的对象转为__PHP_Incomplete_Class类型的不完整对象,此时访问对象属性就会抛出该错误。
修复方案
- 抽离公共类定义:把
Person类的定义单独存为公共文件Person.php,避免重复定义、漏定义的问题,文件内容如下:
<?php class Person { public $name; public $age; public function __construct() { } }
- 调整代码加载顺序:所有操作Session、涉及
Person对象读写的页面,必须先引入Person.php加载类定义,再调用session_start(),保证反序列化时类已存在。- 存储对象的入口页修改后代码:
<?php // 先加载类,再启动session require 'Person.php'; session_start(); if (!isset($_SESSION['persons'])) { $_SESSION['persons'] = array(); } if (isset($_POST['submit'])) { $name = isset($_POST['name']) ? $_POST['name'] : "onbekend"; $age = isset($_POST['age']) ? $_POST['age'] : "onbekend"; $new_person = new Person(); $new_person->name = $name; $new_person->age = $age; $_SESSION['persons'][] = $new_person; header('Location: list.php'); exit; // 跳转后终止脚本执行,避免逻辑异常 }- 遍历展示的列表页修改后代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Person List</title> </head> <body> <?php // 关键:先加载类定义,再启动session require 'Person.php'; session_start(); $data = isset($_SESSION['persons']) ? $_SESSION['persons'] : []; if (!empty($data)) { foreach ($data as $person) { var_dump($person->name); echo "<br>"; } } else { echo "No persons."; } ?> <a href="index.php">return</a> </body> </html> - 避坑提示:类加载和
session_start()的顺序不能颠倒,否则依然会出现不完整对象报错。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

