首页 > 语言 > 关键词   >  php最新资讯  > 正文

PHP中的串行化变量和序列化对象

2008-10-29 10:44 · 稿源:12it.net

其实跟上面没有太大区别,不过是开始的索引变成了保存字符串的形式,比如第一个元素:s:6:"index1";s:3:"abc";第一项就是索引值:s:6:"index1"; s是类型,6是索引字符串的长度,"index1"就是索引的值。后面的s:3:"abc"; 就是元素值,这个好理解,就不讲了。

从上面来看,我们大致了解了基本数据类型的串行化,其实我们完全可以构造自己的串行化功能,或者从这个角度去扩展,开发自己的串行化程序,便于我们的变量交换。

当然,其实我们也可以利用这个功能,把数组或者任意其他变量串行化成字符串,然后通过curl功能来模拟GET/POST功能,达到能够无用用户执行动作就从远程服务器获取数据的功能。

二、对象序列化

对象的序列化也是一个比较普遍的功能,能够把一个对象进行串行化以后变成一个字符串,能够保存或者传输。

我们先看一个例子:

以下为引用的内容:

class TestClass
{
 var $a;
 var $b;

 function TestClass()
 {
  $this->a = "This is a";
  $this->b = "This is b";
 }

 function getA()
 {
  return $this->a;
 }

 function getB()
 {
  return $this->b;
 }
}

$obj = new TestClass;
$str = serialize($obj);
echo $str;

 

输出结果:

O:9:"TestClass":2:{s:1:"a";s:9:"This is a";s:1:"b";s:9:"This is b";}

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

以下为引用的内容:

O:9:"TestClass":2:
{
 s:1:"a";s:9:"This is a";
 s:1:"b";s:9:"This is b";
}

首先看对于对象本身的内容:O:9:"TestClass":2:O是说明这是一个对象类型(object),然后9是代表对象的名字查过浓度,2是代表该对象有几个属性。在看两个属性的内容:

s:1:"a";s:9:"This is a"; 其实跟数组的内容比较类似,第一项:s:1:"a"; 是描述属性名称的,第二项s:9:"This is a"; 是描述属性值的。后面的属性类似。

先说一种对象序列化的应用,下面的内容是PHP手册上,没有更改原文。

serialize() 返回一个字符串,包含着可以储存于 PHP 的任何值的字节流表示。unserialize() 可以用此字符串来重建原始的变量值。用序列化来保存对象可以保存对象中的所有变量。对象中的函数不会被保存,只有类的名称。

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

以下为引用的内容:

<?php
// classa.inc:
class A
{
 var $one = 1;

 function show_one()
 {
  echo $this->one;
 }
}

// page1.php:
include("classa.inc");

$a = new A;
$s = serialize($a);
// 将 $s 存放在某处使 page2.php 能够找到
$fp = fopen("store", "w");
fputs($fp, $s);
fclose($fp);

// page2.php:
// 为了正常解序列化需要这一行
include("classa.inc");

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

// 现在可以用 $a 对象的 show_one() 函数了
$a->show_one();
?>

如果在用会话并使用了 session_register() 来注册对象,这些对象会在每个 PHP 页面结束时被自动序列化,并在接下来的每个页面中自动解序列化。基本上是说这些对象一旦成为会话的一部分,就能在任何页面中出现。

强烈建议在所有的页面中都包括这些注册的对象的类的定义,即使并不是在所有的页面中都用到了这些类。如果没有这样做,一个对象被解序列化了但却没有其类的定义,它将失去与之关联的类并成为 stdClass 的一个对象而完全没有任何可用的函数,这样就很没有用处。

因此如果在以上的例子中 $a 通过运行 session_register("a") 成为了会话的一部分,应该在所有的页面中包含 classa.inc 文件,而不只是page1.php 和 page2.php。

当然,其实序列化对象其实完全可以应用在很多地方。当然,在PHP 5中对序列化的处理不一样了,我们看一下手册中的说法:

serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。

使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。

相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。

使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

举报

  • 相关推荐
  • 大家在看
  • 选奶必看:opo 在奶粉中的功效和作用大揭秘

    文章介绍了OPO结构脂在婴幼儿奶粉中的重要作用。OPO是一种接近母 乳脂肪结构的成分,能减少钙皂形成,改善宝宝便秘问题,促进钙质吸收和骨骼发育,同时增强肠道菌群平衡和免疫力。相比普通奶粉的POP结构,OPO更易消化吸收。佳贝艾特悦护羊奶粉不仅含有4.2g/100g的高含量OPO,其羊奶小分子结构吸收率高达95%,还添加10倍类HMO成分,临床验证可提升保护因子IgG达62%,全方位�

  • iPhone 17 Pro精准机模现身:铝合金一体化机身 一眼精致

    有博主晒出了苹果iPhone 17 Pro的精准机模,相比之前爆料的机模,新机模的质感、精致度更接近真机。 如图所示,iPhone 17 Pro采用横向大矩阵设计,后置三摄位置在左侧,闪光灯和LIDAR激光雷达扫描仪位于矩阵右侧。 不止于此,iPhone 17 Pro采用一体化铝合金材质,摄像头和机身后盖采用火山口过渡设计,这个火山口跟后盖是一体化成型,必须单独铣出,工艺难度很高。

  • 苹果iPhone 17 Pro系列四配色渲染图出炉:史上首款橙色登场

    据majinbuofficial爆料,结合配件厂商和知情人士的消息,确认今年iPhone 17 Pro系列降提供四款配色可选,与前代保持一致。 具体配色是黑色、深蓝色、银色、橙色,其中橙色是iPhone Pro系列有史以来第一次使用。 爆料对四款配色的描述如下: 黑色:经典且优雅,类似此前型号中的黑色钛金属,但采用磨砂处理,增加优雅感并减少指纹可见度。 深蓝色:一种深到几乎夜幕般的色�

  • 邦彦技术&城银股份达成合作:以邦彦云PC重塑医疗信息化底座

    2025年7月14日,城银股份与邦彦技术签署合作协议,共同推进智慧医疗发展。城银深耕医疗信息化17年,将把邦彦云PC纳入全线智慧医疗解决方案的桌面标准;邦彦承诺投入专项资源,将云PC打造为行业标杆。邦彦云PC结合本地性能与云端管控,解决医疗场景对影像秒开、外设兼容、数据安全三大需求。双方将通过技术、场景、生态协同,推动云PC在智慧医院、养老、公卫等场景落地,重塑医疗信息化基础设施,共建面向未来的数字健康底座。

  • 网友住酒店光脚洗澡感染HPV 医生回应:需注意防护

    ​近日,“酒店光脚洗澡可能感染HPV”这一话题在网络上迅速发酵,引发了公众对公共场所卫生安全问题的广泛关注和热烈讨论。据媒体报道以及医学专家分析,在酒店等公共浴室光脚洗澡,确实存在感染跖疣病毒的风险,而该病毒正是一种低危型HPV病毒。 跖疣,这一由人乳头瘤病毒(HPV)引发的足部良性增生物,其感染多发生在温暖潮湿的环境中。医学专家指出,当足部皮

  • iPhone 17系列重回铝合金中框:仅iPhone 17 Air保留钛合金

    据知名分析师Jeff Pu介绍,苹果将在iPhone 17系列重回铝合金中框,只有iPhone 17 Air保留钛合金中框。 苹果在2017年的iPhone X上首次开始使用不锈钢,并且在Pro机型上延续到iPhone 14 Pro,而后又在iPhone 15 Pro开始使用钛合金。 如今看来,钛合金成为苹果最快抛弃的材质。 iPhone 17 Air选择钛合金中框也是迫不得已,因为该机厚度在6mm以内,而钛合金的强度、硬度、韧性、抗拉强度、抗伸

  • 外观大改!iPhone 17系列4款机型全配色曝光

    据分析机构预测,iPhone 17系列将于本月开始试生产,8月份开始量产,并于9月份正式发布。 今年苹果会发布iPhone 17、iPhone 17 Air、iPhone 17 Pro、iPhone 17 Pro Max四款机型。 科技媒体Macworld最新报道称,在苹果内部文件中看到了iPhone 17全系机型的配色,带来了以往从没用过的新配色。

  • 看重全球化前景,海尔智家同时跻身港股两大指数TOP10

    2025年消费投资呈现新趋势:A股消费仍聚焦白酒,港股则转向国货出海和Z世代崛起。国证港股通消费指数年初至今上涨20%,恒生消费指数累计涨幅超15%,而中证消费指数仍下跌。泡泡玛特、安踏体育、海尔智家等新消费龙头获南向资金青睐,其中南向持有海尔智家占比提升3个百分点。这些企业全球化前景被看好:泡泡玛特预计2025年海外收入占比超30%;安踏体育全球市占率将超15%;海尔智家海外营收占比已超50%。东南亚市场表现亮眼,海尔在泰国、越南、印尼白电销量均居第一并逆势增长。企业通过差异化产品满足全球需求,如针对东南亚推出洗头巾洗衣机等创新产品。海尔近期回购A股和H股员工持股计划,彰显管理层信心。华泰证券建议关注具备"产业出海+全球运营"优势的企业。

  • 苹果又挤了一次牙膏:iPhone 17系列升级无线充电

    据爆料,iPhone 17系列机型最高将支持25W无线快充,用户使用第三方MagSafe充电器就能实现25W无线充。 据悉,当前支持MagSafe的iPhone采用的是无线充电联盟第二代充电标准Qi 2,使用第三方充电器时,Qi 2的最大功率为15W;当使用苹果官方的30W充电器时,iPhone 16系列最高可以支持25W无线快充。

  • 红魔10S Pro系列首发上线PC模拟器:手机秒变PC 离线也能玩

    日前,红魔游戏手机宣布,红魔10S Pro系列首发上线PC模拟器。 官方表示,手机更新至RedMagicOS 10.5.11最新版系统后可体验。 红魔10S Pro系列内置的PC模拟器兼容海量PC游戏,支持离线游玩。 此外,PC模拟器还支持游戏PC画质超分增强、手动更改分辨率,适配手柄/键鼠连接操作、显示器投屏等功能,让手机秒变掌机、PC、主机。

这篇文章对你有价值吗?

今日大家都在搜的词: