Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:继续
当一个对象被序列化后,会自动调用sleep方法,这个方法不接受参数,必须返回一个数组。
在执行之前首先serialize() 函数会首先检查是否存在一个魔术方法 sleep.如果存在,sleep()方法会先被调用, 然后才执行序列化操作。
反序列化一个对象后,php会自动调用wakeup,这个方法不需要参数,在反序列化时可以对类属性重赋值或隐藏。
示例
<?php
class User
{
public $name = '曹操';
public $nation ='魏国';
public $age = '58';
public function __sleep()
{
return ['name','nation','age'];
}
//当外部序列化类实例的时候,会自动调用它,用来隐藏一些属性
//serialize()被调用的时候自动执行它
public function __wakeup()
{
$this->name ='刘备';
$this->nation ='蜀国';
}
//外部反序列化的时候会被自动调用
}
$user = new User();
//序列化数据的目的是将数据进行传输或保存
file_put_contents('obj.txt',serialize($user));
// 将类系列化后生成一个obj.txt文件保存
$str = file_get_contents('obj.txt');
//获取obj.txt文件赋值给$str
echo '__sleep:序列化'.$str;
echo "<hr>";
// 反序列化
$obj = unserialize($str);
echo '__wakeup:姓名:'.$obj->name.' | 国家:'.$obj->nation.' | 年龄:'.$obj->age;
示例图:
<?php
interface mDb
{
public function __construct(...$params);
//实现数据库连接接口
}
$user = (new class('mysql:host=localhost;dbname=mysqli','root','142536') implements mDb
{
private $db = null;
//定义一个空的链接
public function __construct(...$params)
{
$this->db = new PDO($params[0],$params[1],$params[2]);
//自动执行定义的私有属性赋值连接参数
}
public function select()
{
return $this->db->query('SELECT * FROM user LIMIT 1')->fetchAll(PDO::FETCH_ASSOC);
}
public function insert()
{
$sql ="INSERT `user` SET `username`='诸葛亮',`password`=sha1('142536'),`age`='38',`sex`='男',`email`='zgl@qq.com',`mobile`='13999999999'";
return $this->db->query($sql) ? '添加成功':'添加失败';
}
public function update()
{
$sql ="UPDATE `user` SET `username`='刘备',`password`=sha1('142536'),`age`='42',`sex`='男',`email`='lb@qq.com',`mobile`='13777777777' WHERE id = 2";
return $this->db->query($sql) ? '更新成功':'更新失败';
}
public function delete()
{
return $this->db->query('DELETE FROM `user` WHERE id>3') ? '删除成功':'删除失败';
}
}
);
print_r($user->select());
echo "<hr>";
print_r($user->insert());
echo "<hr>";
print_r($user->update());
echo "<hr>";
print_r($user->delete());
示例图: