Blogger Information
Blog 26
fans 0
comment 0
visits 21878
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
对象序列化与实战案例
溪边小树
Original
630 people have browsed it

对象序列化与实战案例

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');

课程学习小结

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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:你能理解并掌握, 我比你还高兴
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post