Heim >php教程 >php手册 >简简单单PHP对象序列化学习

简简单单PHP对象序列化学习

WBOY
WBOYOriginal
2016-06-13 11:04:451012Durchsuche

PHP还是比较常用的,于是我研究了一下PHP对象序列化,在这里拿出来和大家分享一下,希望对大家有用。PHP对象序列化也是一个比较普遍的功能,能够把一个对象进行串行化以后变成一个字符串,能够保存或者传输。我们先看一个例子:

<ol class="dp-xml">
<li class="alt"><span><span>classTestClass  </span></span></li>
<li class=""><span>{  </span></li>
<li class="alt"><span>var$a;  </span></li>
<li class=""><span>var$b;  </span></li>
<li class="alt"><span> </span></li>
<li class=""><span>functionTestClass()  </span></li>
<li class="alt"><span>{  </span></li>
<li class="">
<span>$this-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span class="attribute"><font color="#ff0000">a</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"Thisisa"</font></span><span>;  </span>
</li>
<li class="alt">
<span>$this-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span class="attribute"><font color="#ff0000">b</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"Thisisb"</font></span><span>;  </span>
</li>
<li class=""><span>}  </span></li>
<li class="alt"><span> </span></li>
<li class=""><span>functiongetA()  </span></li>
<li class="alt"><span>{  </span></li>
<li class="">
<span>return$this-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>a;  </span>
</li>
<li class="alt"><span>}  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>functiongetB()  </span></li>
<li class=""><span>{  </span></li>
<li class="alt">
<span>return$this-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>b;  </span>
</li>
<li class=""><span>}  </span></li>
<li class="alt"><span>}  </span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">obj</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">newTestClass</font></span><span>;  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">str</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">serialize</font></span><span>($obj);  </span>
</li>
<li class=""><span>echo$str;  </span></li>
</ol>

输出结果:

<ol class="dp-xml"><li class="alt"><span><span>O:9:"TestClass":2:{s:1:"a";s:9:"Thisisa";s:1:"b";s:9:"Thisisb";} </span></span></li></ol>

我们来分析一个对象串行化之后的字符串。

<ol class="dp-xml">
<li class="alt"><span><span>O:9:"TestClass":2:  </span></span></li>
<li class=""><span>{  </span></li>
<li class="alt"><span>s:1:"a";s:9:"Thisisa";  </span></li>
<li class=""><span>s:1:"b";s:9:"Thisisb";  </span></li>
<li class="alt"><span>} </span></li>
</ol>

首先看对于对象本身的内容:O:9:"TestClass":2:O是说明这是一个对象类型(object),然后9是代表对象的名字查过浓度,2是代表该对象有几个属性。在看两个属性的内容:s:1:"a";s:9:"Thisisa";其实跟数组的内容比较类似,第一项:s:1:"a";是描述属性名称的,第二项s:9:"Thisisa";是描述属性值的。后面的属性类似。先说一种PHP对象序列化的应用,下面的内容是PHP手册上,没有更改原文。serialize()返回一个字符串,包含着可以储存于PHP的任何值的字节流表示。unserialize()可以用此字符串来重建原始的变量值。用序列化来保存对象可以保存对象中的所有变量。对象中的函数不会被保存,只有类的名称。

要能够unserialize()一个对象,需要定义该对象的类。也就是,如果序列化了page1.php中类A的对象$a,将得到一个指向类A的字符串并包含有所有$a中变量的值。如果要在page2.php中将其解序列化,重建类A的对象$a,则page2.php中必须要出现类A的定义。这可以例如这样实现,将类A的定义放在一个包含文件中,并在page1.php和page2.php都包含此文件。

<ol class="dp-xml">
<li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li>
<li class=""><span>//classa.inc:  </span></li>
<li class="alt"><span>classA  </span></li>
<li class=""><span>{  </span></li>
<li class="alt">
<span>var$</span><span class="attribute"><font color="#ff0000">one</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">1</font></span><span>;  </span>
</li>
<li class=""><span> </span></li>
<li class="alt"><span>functionshow_one()  </span></li>
<li class=""><span>{  </span></li>
<li class="alt">
<span>echo$this-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>one;  </span>
</li>
<li class=""><span>}  </span></li>
<li class="alt"><span>}  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>//page1.php:  </span></li>
<li class=""><span>include("classa.inc");  </span></li>
<li class="alt"><span> </span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">a</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">newA</font></span><span>;  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">s</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">serialize</font></span><span>($a);  </span>
</li>
<li class=""><span>//将$s存放在某处使page2.php能够找到  </span></li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">fp</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">fopen</font></span><span>("store","w");  </span>
</li>
<li class=""><span>fputs($fp,$s);  </span></li>
<li class="alt"><span>fclose($fp);  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>//page2.php:  </span></li>
<li class=""><span>//为了正常解序列化需要这一行  </span></li>
<li class="alt"><span>include("classa.inc");  </span></li>
<li class=""><span> </span></li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">s</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">implode</font></span><span>("",@file("store"));  </span>
</li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">a</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">unserialize</font></span><span>($s);  </span>
</li>
<li class="alt"><span> </span></li>
<li class=""><span>//现在可以用$a对象的show_one()函数了  </span></li>
<li class="alt">
<span>$a-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>show_one();  </span>
</li>
<li class="">
<span></span><span class="tag"><strong><font color="#006699">?></font></strong></span><span> </span>
</li>
</ol>

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn