批改状态:合格
老师批语:继续
当一个对象被序列化后,会自动调用sleep方法,这个方法不接受参数,必须返回一个数组。
在执行之前首先serialize() 函数会首先检查是否存在一个魔术方法 sleep.如果存在,sleep()方法会先被调用, 然后才执行序列化操作。
反序列化一个对象后,php会自动调用wakeup,这个方法不需要参数,在反序列化时可以对类属性重赋值或隐藏。
示例
<?phpclass 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文件赋值给$strecho '__sleep:序列化'.$str;echo "<hr>";// 反序列化$obj = unserialize($str);echo '__wakeup:姓名:'.$obj->name.' | 国家:'.$obj->nation.' | 年龄:'.$obj->age;
示例图:
<?phpinterface 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());
示例图:
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号