在会话中存储对象

时间:2017-03-30 23:04:25

标签: php session object serialization

我正在尝试将对象存储到$_SESSION中,但我遇到了一些问题。

这是班级:

class Profile {
            var $username;
            var $password;
            var $admin;

            function __construct($username, $password) {
                $this->username = $username;
                $this->password = $password;
            }

            function getName() {
                return $this->username;
            }

            function isAdmin() {
                return $this->admin;
            }

            function setAdmin($admin) {
                return $this->admin = $admin;
            }
        }

我以这种方式将数据存储在会话中:

$_SESSION['profile'] = serialize($profile);

当我尝试在另一个类中加载该数据时,我收到错误:

  

致命错误:main():脚本尝试执行方法或访问不完整对象的属性。请确保在 unserialize()被调用之前加载了您尝试操作的对象的类定义“Profile”,或者提供__autoload()函数以在C:\ wamp64中加载类定义第33行\ www \ login \ hidden.php

我已经转储了加载的对象以检查它是否实际被加载,并且看起来该对象已被反序列化,我可以在对象内看到所有数据本身。

$profile = unserialize($_SESSION['profile']);
var_dump($profile);

我在转储时在本地主机上收到了这个:

C:\wamp64\www\login\hidden.php:31:
object(__PHP_Incomplete_Class)[1]
  public '__PHP_Incomplete_Class_Name' => string 'Profile' (length=7)
  public 'username' => string 'myles' (length=5)
  public 'password' => string 'myles' (length=5)
  public 'admin' => boolean true

如果有人可以帮助我,我真的很迷茫并且不知道该怎么办。那会很棒。

1 个答案:

答案 0 :(得分:1)

在反序列化之前,您需要执行与正常创建对象实例之前相同的操作:

$profile = new Profile("u", "p");

也就是说,确保已包含定义该类的所有文件。这就是错误消息试图告诉您的内容:

  

请确保课程定义"简介"您尝试操作的对象是在 unserialize()被调用之前加载

所以做这样的事情:

<?php
require_once '/path/to/Profile.class.php';
session_start();
$profile = unserialize($_SESSION['profile']);