php会话中保存对象

时间:2011-01-29 04:40:23

标签: php session serialization

我正在尝试在$_SESSION中保存对象,但以下内容:

<?php

$user = db->load( $username, $pass ) ;
$_SESSION[ 'user' ] = $user ;

# on subsequent page loads:
$user = $_SESSION[ 'user' ] ; #retrieve the user from session

不幸的是,这不起作用。

该脚本尝试执行方法或访问不完整对象的属性。请确保加载了_before_ unserialize()被调用的对象的类定义“User”,或者提供__autoload()函数来加载类定义

除非你使用serialize():

<?php

$user = db->load( $username, $pass ) ;
$_SESSION[ 'user' ] = serialize( $user ) ;

# on subsequent page loads:
$user = unserialize( $_SESSION[ 'user' ] ) ; #retrieve the user from session

我假设需要序列化,因为会话信息已保存到磁盘。但PHP不应该足够智能自行序列化东西吗?

使用序列化 / _ 取消序列化 _,这现在可靠吗?或者我的PHP类需要__serialize()方法吗?

5 个答案:

答案 0 :(得分:4)

如果您的对象需要在序列化之前执行某些操作,那么您的类中需要__serialize()。例如,如果它有一个打开文件的引用,那么在序列化之前需要正确关闭该文件。

答案 1 :(得分:1)

你可以使用var_export吗?我今天才刚刚了解它,所以也许它并不是那么相关。

答案 2 :(得分:0)

就php编译器而言,你所做的只是将一个对象(序列化)写入一个数组,它是一个不同的进程,确保$ _SESSION在下一页可用。序列化与写入磁盘无关,与内存有关,因为分配给对象上各种方法的内存将无法在下一页上使用。序列化是PHP在页面上保存对象的方式,您必须自己完成。

答案 3 :(得分:0)

更好地使用

json_encode()  json_decode()

答案 4 :(得分:0)

目前最好的方法可能是与您的班级实施Serializable界面。