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

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(),保证反序列化时类已存在。
    1. 存储对象的入口页修改后代码:
    <?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; // 跳转后终止脚本执行,避免逻辑异常
    }
    
    1. 遍历展示的列表页修改后代码:
    <!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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:31:01