PHP如何对SESSION序列化(SESSION对象处理)

這個問題有點奇怪,在Java和.net的世界裡還未碰到過.......
看來PHP對對象的支持還不是太友好,呵呵~~~

[轉載於:] http://blog.csdn.net/yehell/archive/2007/12/19/1953826.aspx

今天在php文件中设置了一个session.并将一个类的对象保存在这个session中。可是读取session得时候却出现了__PHP_Incomplete_Class问题。print_r()一下发现session中有这个对象的值,但是却不能将值取出。

在网上检索了一下,原因出在session对象得序列化问题上。各种各样的解决方法让人看了头晕,就是不好用。

解决方法:

$_SESSION["ORDER_SEARCH_CASE"] = serialize($searchcase);//赋值时把对象序列化一下

$searchcase = unserialize($_SESSION["ORDER_SEARCH_CASE"]);//取值的时候再反序列化一下

搞定了!!

至于原理还不太清楚:)有待研究

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

php:用序列化或session对象让oo进行到底

 

php:用序列化或session对象让oo进行到底

 

 

php支持面向对象编程,这使得我们在编程时可以尽可能使用类及对象来简化

 

我们的程序,减少代码维护的工作量.

 

可是由于变量到脚本执行完毕就释放,我们本页所生成的对象想在其它页面使用时

 

便碰到了麻烦.可是,在很多情况下,有些任务在一两个页面是无法完成的.如果能够

 

将对象及其方法传递到我们想使用对象的页面,那岂不是个很好的主意.

 

虽然用get 或post的hide方法传递对象变量然后在新页面建立一新的对象,再然后

 

用构造函数来初始化新对象,好像也行的通,可是......,很麻烦,想必大家能想像得到吧.

 

经过长时间的尝试,现总结两种方法来传递对象.

 

一种,序列化(php4才具有的功能),利用这个功能我们可以将对象序列化,然后在我们需要

 

的页面将对象变量反序列化来使用.

 

举例如下:

 

//*********class.php 定义类*********

<?

class a

{

    var $a;

    var $b;

    var $c;

    function a($x,$y)

    {

        $this->a=$x;

        $this->b=$y;

        $this->give_var_value();

    }

 

    function give_var_value()

    {

        for($i=0;$i<100;$i++)

        {

            $this->c[$i]=$i;

        }

    }

 

    function show_var_value()

    {

        echo $this->a.$this->b."<br>";

        for($i=0;$i<100;$i++)

        {

            echo "c[$i]=".$this->c[$i]."<br>";

        }

 

    }

    

}

 

?>

 

//**************a.php 建立对象并序列化**************

<?

 

require_once("class.php");

 

$a=new a("hello,","world!");

 

$s = serialize($a); //序列化对象a

 

$fp = fopen("store", "w");//以"w"方式打开一文件并获得文件句柄,请在此注意目录属性.

 

fputs($fp, $s);//写入文件

 

fclose($fp);//关闭文件句柄

 

?>

 

//**************b.php 反序列化对象并调用其方法**************

 

<?

 

require_once("class.php");//由于序列化对象不能序列化其方法,所以必须require class.php文件

 

$s = implode("", @file("store"));

 

$a = unserialize($s);

 

$a->show_var_value();

 

?>

 

 

 

以上例子在win2k server apache2.0.36 php4.2.1调试通过

 

 

序列化只能用于有限用户的情况下,因为需要为每个用户建立文件,要主意目录的权限,而且保证文件名不能重复.在用户不能正常退出

 

浏览器的情况下,不能保证文件被删除.所以这种方法用在后台管理时比较方便.

 

 

当用户数量很多时,我们可以用session来保存对象.因为session文件是由系统来管理的,所以我们不必为文件的建立,

 

删除,目录权限等问题而伤脑筋.示例如下:

 

//*******************a1.php 将对象注册为session变量****************

 

<?

 

require_once("class.php");

 

session_start();

 

$_SESSION["a"]=new a("hello,","world!");

 

?>

 

//*******************b1.php 使用session变量****************

 

<?

 

require_once("class.php");//同样,注册对象为session变量时并不能保存其方法,所以必须require class.php文件

 

session_start();

 

$_SESSION["a"]->show_var_value();

 

?>

 

以上例子在win98se apache2.0.36 php4.2.1调试通过

 

 

附录:现将对象序列化以及注册为session变量的文件粘贴如下,希望有心人能分析出一二来供大家参考.

 

序列化文件:

 

O:1:"a":3:{s:1:"a";s:6:"hello,";s:1:"b";s:6:"world!";s:1:"c";a:100:{i:0;i:0;i:1;i:1;i:2;i:2;

i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;i:10;i:10;i:11;i:11;i:12;i:12;i:13;i

:13;i:14;i:14;i:15;i:15;i:16;i:16;i:17;i:17;i:18;i:18;i:19;i:19;i:20;i:20;i:21;i:21;i:22;i:2

2;i:23;i:23;i:24;i:24;i:25;i:25;i:26;i:26;i:27;i:27;i:28;i:28;i:29;i:29;i:30;i:30;i:31;i:31;

i:32;i:32;i:33;i:33;i:34;i:34;i:35;i:35;i:36;i:36;i:37;i:37;i:38;i:38;i:39;i:39;i:40;i:40;i:

41;i:41;i:42;i:42;i:43;i:43;i:44;i:44;i:45;i:45;i:46;i:46;i:47;i:47;i:48;i:48;i:49;i:49;i:50

;i:50;i:51;i:51;i:52;i:52;i:53;i:53;i:54;i:54;i:55;i:55;i:56;i:56;i:57;i:57;i:58;i:58;i:59;i

:59;i:60;i:60;i:61;i:61;i:62;i:62;i:63;i:63;i:64;i:64;i:65;i:65;i:66;i:66;i:67;i:67;i:68;i:6

8;i:69;i:69;i:70;i:70;i:71;i:71;i:72;i:72;i:73;i:73;i:74;i:74;i:75;i:75;i:76;i:76;i:77;i:77;

i:78;i:78;i:79;i:79;i:80;i:80;i:81;i:81;i:82;i:82;i:83;i:83;i:84;i:84;i:85;i:85;i:86;i:86;i:

87;i:87;i:88;i:88;i:89;i:89;i:90;i:90;i:91;i:91;i:92;i:92;i:93;i:93;i:94;i:94;i:95;i:95;i:96

;i:96;i:97;i:97;i:98;i:98;i:99;i:99;}}

 

session文件:

 

a|O:1:"a":3:{s:1:"a";s:6:"hello,";s:1:"b";s:6:"world!";s:1:"c";a:100:{i:0;i:0;i:1;i:1;i:2;i:

2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;i:10;i:10;i:11;i:11;i:12;i:12;i:13

;i:13;i:14;i:14;i:15;i:15;i:16;i:16;i:17;i:17;i:18;i:18;i:19;i:19;i:20;i:20;i:21;i:21;i:22;i

:22;i:23;i:23;i:24;i:24;i:25;i:25;i:26;i:26;i:27;i:27;i:28;i:28;i:29;i:29;i:30;i:30;i:31;i:3

1;i:32;i:32;i:33;i:33;i:34;i:34;i:35;i:35;i:36;i:36;i:37;i:37;i:38;i:38;i:39;i:39;i:40;i:40;

i:41;i:41;i:42;i:42;i:43;i:43;i:44;i:44;i:45;i:45;i:46;i:46;i:47;i:47;i:48;i:48;i:49;i:49;i:

50;i:50;i:51;i:51;i:52;i:52;i:53;i:53;i:54;i:54;i:55;i:55;i:56;i:56;i:57;i:57;i:58;i:58;i:59

;i:59;i:60;i:60;i:61;i:61;i:62;i:62;i:63;i:63;i:64;i:64;i:65;i:65;i:66;i:66;i:67;i:67;i:68;i

:68;i:69;i:69;i:70;i:70;i:71;i:71;i:72;i:72;i:73;i:73;i:74;i:74;i:75;i:75;i:76;i:76;i:77;i:7

7;i:78;i:78;i:79;i:79;i:80;i:80;i:81;i:81;i:82;i:82;i:83;i:83;i:84;i:84;i:85;i:85;i:86;i:86;

i:87;i:87;i:88;i:88;i:89;i:89;i:90;i:90;i:91;i:91;i:92;i:92;i:93;i:93;i:94;i:94;i:95;i:95;i:

96;i:96;i:97;i:97;i:98;i:98;i:99;i:99;}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值