PHP魔术方法之序列化与反序列化技术

目前理解觉得序列化就是用来保存数据的,将对象或变量以字符串形式保存。反序列化无非就是序列化转化成原来的变量或对象。

1.序列化:

  定义:就是将一个变量所代表的“内存”数据,转换为“字符串”形式并持久保存在硬盘中。

   1.1普通变量的序列化

如:$v1 = 123;//这个变量代表内存空间的一段数据

  $s1 = serialize($v1);//用serialize()方法将任何类型的变量转化为字符串并序列化

file_put_contents("./file1.txt",$s1)//将字符串保存在对应位置的硬盘文件中,最后会和此文件保存在 同一个目录中

   1.2对象的序列化,由于对象有属性和方法,序列化时会保存属性数据,而方法会被忽略。

如:$a = new A();

        $b = serialize($a);

而且对象序列化时系统会自动调用__sleep()方法,这个方法必须要自己写在类里,如:

  public function __sleep()

 {

return array('p1','p2');//必须返回一个数组,var_dump()打印出数组键是属性名,值是类型和 对应属性值。

 }

反序列化是用unserialize()方法,对应的__wakeup()方法。


### PHP 序列化反序列化魔术方法 #### __sleep 方法触发机制 `__sleep()` 是 PHP 中的一个魔术方法,在对象被序列化之前自动调用。此方法可以返回一个数组,指定哪些属性应该被序列化。通过这种方式,开发人员可以选择只保存重要的数据成员,从而减少存储空间并提高安全性。 ```php <?php class Peak { public $name = "1stPeak"; public $sex = "man"; public $age = "18"; public function __sleep() { return ['age']; // 只序列化 age 属性 } } $a = new Peak; echo serialize($a); ?> ``` 上述代码只会序列化 `age` 属性[^2]。 #### __wakeup 方法触发机制 `__wakeup()` 魔术方法会在对象从字符串恢复成对象之后立即调用。该方法通常用于重新建立数据库连接、初始化资源或其他任何需要在反序列化完成后执行的任务。 ```php <?php class Test { public $sex; public $name; public $age; public function __wakeup(){ echo '当外部实体使用unserialize时会调用这里的wakeup()方法<br>'; $this->age = 556; // 设置默认年龄值 } } $person = new Test(); $person->name = 'spaceman'; $person->age = 21; $person->sex = '男'; $a = serialize($person); var_dump(unserialize($a)); ?> ``` 这段代码展示了如何利用 `__wakeup()` 来设置某些初始参数或打印调试信息[^5]。 #### 安全性和最佳实践 为了增强应用程序的安全性,建议: - 在 `__sleep()` 方法中仅包含必要的属性,避免暴露敏感信息。 - 利用 `__wakeup()` 进行验证和清理工作,确保对象处于有效状态。 这样做有助于防止潜在的安全漏洞,特别是在处理来自不可信源的数据时[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值