博客列表 >对象序列化与实战案例

对象序列化与实战案例

溪边小树
溪边小树原创
2020年05月13日 14:24:50631浏览

对象序列化与实战案例

1、案例演示对象序列化

  1. <?php
  2. // 对象序列化与__sleep(), __wakeup()
  3. // 1. 序列化
  4. echo serialize(100). '<br>';
  5. echo serialize('php.cn'). '<br>';
  6. echo serialize([80, 'hello', true, null, [12,34]]). '<br>';
  7. echo '<hr>';
  8. // 2. 序列化一个对象呢?
  9. abstract class Dad
  10. {
  11. protected $name = '胡八一';
  12. private $salary = 7788;
  13. }
  14. class Son extends Dad
  15. {
  16. public $sex = '男';
  17. protected $age = 40;
  18. private $isMarried = false;
  19. protected static $nationality = '中国/CHINA';
  20. public function __get($name)
  21. {
  22. return $this->$name;
  23. }
  24. public function __sleep(): array
  25. {
  26. return ['name', 'sex', 'isMarried'];
  27. }
  28. public function __wakeup()
  29. {
  30. $this->age = 35;
  31. $this->sex = '保密';
  32. }
  33. }
  34. $son = new Son();
  35. // file_put_contents('obj_seria.txt', serialize($son));
  36. // $str = file_get_contents('obj_seria.txt');
  37. // echo $str;
  38. // $obj = unserialize($str);
  39. // echo '<hr>';
  40. // var_dump($obj);
  41. // echo '<hr>';
  42. echo serialize($son);
  43. echo '<hr>';
  44. $str = serialize($son);
  45. var_dump(unserialize($str));

2、案例演示sleep(), wakeup()

  1. <?php
  2. // __sleep(), __wakeup()
  3. // 创建数据库连接类,
  4. // 1. 实例化的时候, 自动连接,并创建连接对象
  5. // 2. 外部对连接对象序列化时, 获取到连接参数
  6. // 3. 反序列化的时候, 自动重新连接数据库
  7. class Connection
  8. {
  9. protected $link;
  10. private $params = [];
  11. // 构造方法
  12. public function __construct($dsn, $username, $password)
  13. {
  14. $this->params['dsn'] = $dsn;
  15. $this->params['username'] = $username;
  16. $this->params['password'] = $password;
  17. $this->connect();
  18. }
  19. public function connect()
  20. {
  21. $this->link = new PDO(...array_values($this->params));
  22. }
  23. // 序列化的时候返回连接参数
  24. public function __sleep()
  25. {
  26. return ['params'];
  27. }
  28. // 反序列化时自动重新连接
  29. public function __wakeup()
  30. {
  31. $this->connect();
  32. }
  33. // 测试
  34. public function select($sql)
  35. {
  36. return $this->link->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  37. }
  38. }
  39. // 客户端
  40. $db = new Connection('mysql:host=localhost;dbname=phpedu', 'root','root');
  41. print_r($db->select('select * from users limit 3'));
  42. echo '<hr>';
  43. $str = serialize($db);
  44. echo $str , '<br>';
  45. // 反序列化, 会重新返回一下新对象,所以要重新连接才能查询
  46. $obj = unserialize($str);
  47. print_r($obj->select('select * from users limit 3'));

3、对象复制与__clone

  1. <?php
  2. // 对象复制与__clone
  3. // 对象是引用类型,将对象做为值, 赋值给其它变量的时候, 遵循"引用传递"的规则
  4. class User
  5. {
  6. public $name = '朱老师';
  7. public $points = 1000;
  8. public function __clone()
  9. {
  10. $this->points = 0;
  11. }
  12. }
  13. $user1 = new User();
  14. // 引用
  15. $user2 = $user1;
  16. // $user2 就是 $user1的别名
  17. $user2->name = '王老师';
  18. echo $user1->name;
  19. echo '<hr>';
  20. // clone 克隆出一个全新对象
  21. $user3 = clone $user1;
  22. echo $user3->name, '----', $user3->points;

4、自定义异常类, 处理用户登录与验证, 模拟就可以不用表单了

  1. <?php
  2. // __toString():把对象当成字符串打印的时候调用
  3. class User
  4. {
  5. public function __toString()
  6. {
  7. return __METHOD__;
  8. }
  9. }
  10. $user = new User();
  11. echo $user;
  12. echo '<hr>';
  13. // 异常类的典型应用
  14. try {
  15. // 这里的是用户代码,可能会出错
  16. throw new Exception('验证失败');
  17. } catch (Exception $e) {
  18. echo $e->getMessage();
  19. }
  20. echo '<hr>';
  21. try {
  22. $db = new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'root');
  23. } catch (Exception $e) {
  24. echo $e->getMessage();
  25. }
  26. echo '<hr>';
  27. // 自已创建一个针对数据库操作的异常类
  28. class DbException extends Exception
  29. {
  30. public function __toString()
  31. {
  32. return <<< DBE
  33. <style>
  34. table {border-collapse: collapse;border:1px solid black;text-align: center;}
  35. td {border:1px solid black;padding: 5px;}
  36. tr:first-of-type {background-color:#eee;}
  37. tr:last-of-type td {color: coral;}
  38. </style>
  39. <table>
  40. <tr><td>代码</td><td>信息</td><td>文件</td><td>行号</td></tr>
  41. <tr><td>$this->code</td><td>$this->message</td><td>$this->file</td><td>$this->line</td></tr>
  42. </table>
  43. DBE;
  44. }
  45. }
  46. try {
  47. $db = new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'root');
  48. throw new DbException('连接成功', 29);
  49. } catch (DbException $e) {
  50. echo $e;
  51. }

5、案例演示匿名类?

  1. <?php
  2. // 匿名类
  3. class Demo
  4. {
  5. public function hello($name)
  6. {
  7. return 'Hello ' . $name;
  8. }
  9. }
  10. // 1. 传统
  11. $demo = new Demo();
  12. echo $demo->hello('小树小站') , '<hr>';
  13. // 2. 如果这个对象只用一次, 可以将实例化与成员访问二合一
  14. echo (new Demo())->hello('小树小站') , '<hr>';
  15. // 3. 如果这个类只用一次, 索性将类, 类的实例化,成员访问三合一
  16. echo (new class
  17. {
  18. public function hello($name)
  19. {
  20. return 'Hello ' . $name;
  21. }
  22. })->hello('小树小站') , '<hr>';
  23. // 用在什么地方?
  24. // 经典场景1: 实现接口部分功能, 仅用在当前项目中
  25. interface iDb
  26. {
  27. public function __construct(...$params);
  28. }
  29. // 你的项目是使用PDO操作数据库, 但是当前测试脚本使用的是mysqli做一些简单查询, 可以使用匿名类实现这个接口
  30. // 用mysqli做一次查询
  31. $res = (new class ('mysql:host=localhost;dbname=phpedu', 'root', 'root') implements iDb {
  32. private $db = null;
  33. public function __construct(...$params)
  34. {
  35. $this->db = new PDO($params[0],$params[1],$params[2]);
  36. }
  37. public function select($where="")
  38. {
  39. $where = empty($where) ? '' : ' WHERE ' . $where;
  40. return $this->db
  41. ->query('SELECT id,name,email FROM users ' . $where . ' LIMIT 4')
  42. ->fetchAll(PDO::FETCH_ASSOC);
  43. }
  44. }
  45. )->select();
  46. printf('<pre>%s</pre>', print_r($res, true));
  47. // 经典场景2: 用在函数/方法的参数中
  48. function get(object $user, string $name)
  49. {
  50. return $user->write($name);
  51. }
  52. echo get(new class (){
  53. public function write($name)
  54. {
  55. return 'Hello Hello ' . $name;
  56. }
  57. }, 'zhangsan');

课程学习小结

本次课程老师从浅显易懂的实例出发,详解介绍了对象序列化与实战案例相关内容,通过回看视频及讲义代码,尽力理解老师列举的步步递进的层次关系与应用场景, 并通过修改实现部分代码对照差异之处,感觉收获较大。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议