日期:2013-03-23  浏览次数:20556 次

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