【问题标题】:php saving object in sessionphp在会话中保存对象
【发布时间】:2011-01-29 04:40:22
【问题描述】:

我正在尝试在$_SESSION 中保存一个对象,但是如下:

<?php

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

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

很遗憾,这不起作用。

该脚本试图执行方法或访问不完整对象的属性。请确保您尝试操作的对象的类定义“用户”已加载_before_ unserialize() 被调用或提供 __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 不应该足够聪明地自己序列化东西吗?

并且使用 serialize/_unserialize_,现在可以可靠地工作吗?还是我的 PHP 类中需要 __serialize() 方法?

【问题讨论】:

  • 你有没有想过使用 Zend.Session?

标签: php session serialization


【解决方案1】:

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

【讨论】:

  • 在这种情况下,您将使用 __sleep 和 __wakeup br2.php.net/manual/en/function.serialize.php >
  • 我很抱歉,这就是我的意思,没有称为 __serialize() 的 php 魔术方法。
【解决方案2】:

你能用var_export吗?我今天才知道它,所以也许它并不那么相关。

【讨论】:

  • var_export() 并不是真正的序列化函数。它只是创建一个变量的人类可读的字符串表示(如var_dump()。它不会创建变量的完整表示,也没有反向函数。php.net/manual/en/function.var-export.php
  • @Lèse 我对var_export 的理解是它返回的字符串可能是eval ed 以获取(或多或少)相同的变量。这是不正确的吗?
  • 啊,你是对的。我把它与print_r() 混淆了。但是,最好使用serialize() 序列化对象,因为在某些情况下var_export() 的输出不会产生正确的结果(例如具有循环引用的对象)。
  • 是的,但是,这是一个有效的选择吗?
  • 视情况而定;如果您不需要序列化 ​​var_export 不兼容的对象,我认为可以。我个人尽量避免eval,但这是一种有效的做法。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    更好的使用

    json_encode()  json_decode()
    

    【讨论】:

      【解决方案5】:

      目前最好的方法可能是在你的类中实现Serializable 接口。

      【讨论】:

        猜你喜欢
        • 2017-12-06
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 2017-05-24
        • 2010-12-19
        • 1970-01-01
        • 2011-01-03
        相关资源
        最近更新 更多