在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1.什么是php序列号和反序列化
在开发的过程中常常遇到需要把对象或者数组进行序列号存储,反序列化输出的情况。特别是当需要把数组存储到mysql数据库中时,我们时常需要将数组进行序列化操作。 php序列化(serialize):是将变量转换为可保存或传输的字符串的过程 php反序列化(unserialize):就是在适当的时候把这个字符串再转化成原来的变量使用 这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。 常见的php序列化和反序列化方式主要有:serialize,unserialize;json_encode,json_decode。
2.php类与属性 简单写一段php代码,与Java里面的类、对象类似
运行结果:
3.魔术方法 php中有着魔术方法,以两个__下划线开头的方法称为魔术方法。在触发某个事件后,魔术方法会自动调用。
通过触发事件而调用不通的魔术方法 <?php class animal { private $name = 'Nolan'; public function sleep(){ echo "<hr>"; echo $this->name . " is sleeping...\n"; } public function __wakeup(){ echo "<hr>"; echo "调用了__wakeup()方法\n"; } public function __construct(){ echo "<hr>"; echo "调用了__construct()方法\n"; } public function __destruct(){ echo "<hr>"; echo "调用了__destruct()方法\n"; } public function __toString(){ echo "<hr>"; echo "调用了__toString()方法\n"; } public function __set($key, $value){ echo "<hr>"; echo "调用了__set()方法\n"; } public function __get($key) { echo "<hr>"; echo "调用了__get()方法\n"; } } $ji = new animal(); 就会出现如下结果,调用两次__destruct方法是因为在animal类的一个对象被序列号后的字符串又被反序列化时调用 在程序结束时又会调用。
序列化例子 <?php class object{ public $team = 'Nolan123'; private $team_name = 'power'; protected $team_group = 'biubiu'; function test(){ $this->$team_members = 'hard work!'; } } $object = new object(); echo serialize($object); ?>
运行结果
对象类型:对象长度:“对象名称”:类里面的变量个数:{变量类型:长度:“名称”;类型:长度:值;.......} O是指一个对象,6是object的长度,3是有三个属性,{}里面是属性的内容; ss是team的类型,4是team长度,以此类推。 注意类里面的方法不会参加序列化。 需要注意的是变量受到不同修饰符(public,private,protected)修饰进行序列化时,序列化后变量的长度和名称会发生变化。
通过对比发现,在受保护的成员前都多了两个字节,受保护的成员在序列化时规则: 1. 受Private修饰的私有成员,序列化时: \x00 + [私有成员所在类名] + \x00 [变量名] 2. 受Protected修饰的成员,序列化时:\x00 + * + \x00 + [变量名] 其中,"\x00"代表ASCII为0的值,即空字节," * " 必不可少。 序列化格式中字母的意思: a - array b - boolean d - double i - integer o - common object r - reference s - string C - custom object O - class N - null R - pointer reference U - unicode string 反序列化 使用序列化后的字符串,用反序列化函数unserialize进行反序列化 <?php class object{ public $team = 'Nolan123'; private $team_name = 'power'; protected $team_group = 'biubiu'; function test(){ echo $this->team." hard work!<br>"; } } $object = new object(); $ser = serialize($object); echo "$ser<br>"; $ser = unserialize($ser); $ser->test(); var_dump($ser); ?> 调用test方法,用var_dump方法打印所有的对象,可以查看对象内部的数据结构
|
2022-08-18
2022-08-17
2022-11-06
2022-07-29
2022-08-17
请发表评论