查看完整版本: php:用序列化或session对象让oo进行到底

lily 2007-8-2 14:07

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

             <p>php支持<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%C3%E6%CF%F2%B6%D4%CF%F3');" target="_self"><u><strong>面向对象</strong></u></a>编程,这使得我们在编程时可以尽可能使用类及对象来简化<br><br>我们的程序,减少<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B4%FA%C2%EB');" target="_self"><u><strong>代码</strong></u></a>维护的<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B9%A4%D7%F7');" target="_self"><u><strong>工作</strong></u></a>量.<br><br>可是由于变量到脚本执行完毕就释放,我们本页所生成的对象想在其它页面使用时便碰到了麻烦.可是,在很多情况下,有些任务在一两个页面是无法完成的.如果能够将对象及其<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B7%BD%B7%A8');" target="_self"><u><strong>方法</strong></u></a>传递到我们想使用对象的页面,那岂不是个很好的主意.虽然用get 或post的hide方法传递对象变量然后在新页面建立一新的对象,再然后用构造函数来初始化新对象,好像也行的通,可是......,很麻烦,想必大家能想像得到吧.经过长时间的尝试,现总结两种方法来传递对象.<br><br>一种,序列化(php4才具有的功能),利用这个功能我们可以将对象序列化,然后在我们需要的页面将对象变量反序列化来使用.<br><br>举例如下:<br><br>//*********class.php 定义类*********<br>&lt;?<br>class a<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;var $a;<br>&nbsp;&nbsp;&nbsp;&nbsp;var $b;<br>&nbsp;&nbsp;&nbsp;&nbsp;var $c;<br>&nbsp;&nbsp;&nbsp;&nbsp;function a($x,$y)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;a=$x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;b=$y;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;give_var_value();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;function give_var_value()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i=0;$i&lt;100;$i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;c[$i]=$i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;function show_var_value()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $this-&gt;a.$this-&gt;b."&lt;br&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for($i=0;$i&lt;100;$i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "c[$i]=".$this-&gt;c[$i]."&lt;br&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;<br>}<br><br>?&gt;<br><br>//**************a.php 建立对象并序列化**************<br>&lt;?<br><br>require_once("class.php");<br><br>$a=new a("hello,","world!");<br><br>$s = serialize($a); //序列化对象a<br><br>$fp = fopen("store", "w");//以"w"方式打开一文件并获得文件句柄,请在此注意目录属性. <br><br>fputs($fp, $s);//写入文件<br><br>fclose($fp);//关闭文件句柄<br><br>?&gt;<br><br>//**************b.php 反序列化对象并调用其方法**************<br><br>&lt;?<br><br>require_once("class.php");//由于序列化对象不能序列化其方法,所以必须require class.php文件<br><br>$s = implode("", @file("store"));<br><br>$a = unserialize($s);<br><br>$a-&gt;show_var_value();<br><br>?&gt;<br><br>以上例子在win2k server apache2.0.36 php4.2.1调试通过序列化只能用于有限用户的情况下,因为需要为每个用户建立文件,要主意目录的权限,而且保证文件名不能重复.在用户不能正常退出浏览器的情况下,不能保证文件被删除.所以这种方法用在后台管理时比较方便.<br><br>当用户数量很多时,我们可以用session来保存对象.因为session文件是由系统来管理的,所以我们不必为文件的建立,删除,目录权限等问题而伤脑筋.示例如下:<br><br>//*******************a1.php 将对象注册为session变量****************<br><br>&lt;?<br><br>require_once("class.php");<br><br>session_start();<br><br>$_session["a"]=new a("hello,","world!");<br><br>?&gt;<br><br>//*******************b1.php 使用session变量****************<br><br>&lt;?<br><br>require_once("class.php");//同样,注册对象为session变量时并不能保存其方法,所以必须require class.php文件<br><br>session_start();<br><br>$_session["a"]-&gt;show_var_value();<br><br>?&gt;<br><br>以上例子在win98se apache2.0.36 php4.2.1调试通过<br><br>附录:现将对象序列化以及注册为session变量的文件粘贴如下,希望有心人能分析出一二来供大家参考.<br><br>序列化文件:<br><br>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;<br>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<br>: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<br>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;<br>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:<br>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<br>;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<br>: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<br>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;<br>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:<br>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<br>;i:96;i:97;i:97;i:98;i:98;i:99;i:99;}}<br><br>session文件:<br><br>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:<br>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<br>;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<br>: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<br>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;<br>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:<br>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<br>;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<br>: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<br>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;<br>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:<br>96;i:96;i:97;i:97;i:98;i:98;i:99;i:99;}}<br><div>
页: [1]
查看完整版本: php:用序列化或session对象让oo进行到底
PageRank