PHP OOP会话对象-序列化-非序列化-处理它

PHP OOP会话对象-序列化-非序列化-处理它,php,Php,我正在构建一些常见的类对象,这些对象将被常规地塞进$\u会话对象中。我了解到,在向会话添加对象时,有时可以不序列化就添加对象,但这是不可靠的,所以我先序列化,每次都可以 我发现以下内容令人难以置信地重复和笨拙。。。这就像我必须从会话中签出对象,做一些工作,然后记住以正确的方式进行检查。是否有一种更有效、更具创造性的方法可重复使用。帮助php专家 // Painful Code $tmpObj = new clsSession; // Class setup for intellisense t

我正在构建一些常见的类对象,这些对象将被常规地塞进$\u会话对象中。我了解到,在向会话添加对象时,有时可以不序列化就添加对象,但这是不可靠的,所以我先序列化,每次都可以

我发现以下内容令人难以置信地重复和笨拙。。。这就像我必须从会话中签出对象,做一些工作,然后记住以正确的方式进行检查。是否有一种更有效、更具创造性的方法可重复使用。帮助php专家

// Painful Code
$tmpObj = new clsSession;  // Class setup for intellisense to work.
$tmpObj = unserialize($_SESSION['objSession']);  // I assign so i can get intellisense as well.  
$tmpObj //... do some work make some changes some other logic could be lengthy... 
// and then i have to remember to do the following
$_SESSION['objSession'] = serialize($tmpObj);
unset $tmpObj;

/* or better */

$tmpObj = $_SESSION['objSession'];
$tmpObj = unserialize($tmpObj);
$tmpObj //... do some work make some changes some other logic
//and then i have to remember to do the following
$_SESSION['objSession'] = serialize($tmpObj);
unset $tmpObj;

在要序列化的对象中,使用
\u sleep
魔术方法。这只是返回请求之间所需的属性数组,并允许会话中的自动序列化对象正常工作

e、 g


您可以将对象直接存储到会话中,而无需先序列化它。这是因为保存会话时会自动进行序列化。只需确保您正在自动加载类定义。如果没有,您必须在希望使用存储会话对象的每个页面上包含类定义。

除非我遗漏了什么,否则您所做的只是序列化两次:

<?php

class Foo{
    public $id;
}

$f = new Foo;
$f->id = 33;

var_dump( serialize($f) ); // Standard storage
var_dump( serialize(serialize($f)) ); // Yours

蒂姆,谢谢你的意见。几年前,我遇到了对象和会话的稳定性问题;序列化和非序列化。会话反序列化期间缺少类定义是常见的。如果类定义未定义,PHP将创建类uu PHP_complete_类的不完整对象。这个退化的对象错过了所有方法。为了避免此错误,必须在启动会话之前包含每个类定义。因此,如果在启动会话之前实现自动加载程序,则不会出现任何问题。此解决方案在过去6年多的时间里一直运行良好。

为什么在将其存储到会话中之前要对其进行序列化?会话处理程序应该负责存储
$\u会话
数组所需的任何序列化。我发现,对于对象,如果未序列化且我在各种文章/网页上看到了这个问题,即在分配之前需要先序列化。我希望我没有这样做,但如果没有输出,会话对象在尝试重新使用它之后经常会被置空。PHP5.3Apache2。2@TimWiley这是一个有趣的问题。你能包括这些文章的链接吗?@Mathieu-这里只是堆栈中的一个-查找标题“在php会话中存储对象”这正是我遇到的问题。。。在堆栈之外还有其他人也有同样的问题。难道_sleep方法不能设置会话本身吗?这样会将对象耦合到会话,耦合不好,嗯。Joe我通过痛苦的疑难解答发现,在没有序列化的情况下将对象分配给类会导致稳定性问题。我发现它一直有效,直到你跨网页,然后会话中的对象经常跨页面为空。。。我对此进行了研究,发现很多人遇到了这种情况,不得不对他们的对象进行序列化,这样就阻止了这种情况的发生。蒂姆,谢谢你的意见。我还遇到了对象和会话的稳定性问题;序列化和非序列化。特别是在会话反序列化期间缺少类定义是一个常见错误。如果未定义类定义,PHP将创建类_PHP_complete_类的不完整对象。这个退化的对象错过了所有方法。为了避免此错误,必须在启动会话之前包含每个类定义。
<?php

class Foo{
    public $id;
}

$f = new Foo;
$f->id = 33;

var_dump( serialize($f) ); // Standard storage
var_dump( serialize(serialize($f)) ); // Yours
<?php

session_start();
if( empty($_SESSION) ){
    require_once('./foo.php');

    $f = new Foo;
    $f->id = 33;

    $_SESSION['f'] = $f;
    // object(Foo)#1 (1) { ["id"]=> int(33) } 
}else{
    $f = $_SESSION['f'];
    // object(__PHP_Incomplete_Class)#1 (2) { ["__PHP_Incomplete_Class_Name"]=> string(3) "Foo" ["id"]=> int(33) } 
}
var_dump($f);