博客列表 >PHP 对象的序列化和克隆,异常,匿名类

PHP 对象的序列化和克隆,异常,匿名类

王娇
王娇原创
2020年05月06日 15:17:28691浏览

学习总结

  • 如果想复制一个对象,则要使用clone关键字
  • 序列化一个对象时,会触发__sleep()函数
  • 反序列化一个对象时,会触发__wakeup()函数
  • 可以自定义一个异常类用来处理用户提交的数据
  • 匿名类用在暂时只调用一次的类或者回调函数中的参数为对象时

1.对象的序列化和克隆

  1. <?php
  2. //创建一个数据库连接的类
  3. class DB
  4. {
  5. protected $dbConn;
  6. private $paras = [];
  7. public function __construct()
  8. {
  9. $this ->paras['host'] = 'localhost';
  10. $this ->paras['userName'] = 'root';
  11. $this ->paras['passWord'] = 'root';
  12. $this ->paras['dbName'] = 'db_pursey';
  13. $this ->conn();
  14. }
  15. public function conn()
  16. {
  17. $this ->dbConn = mysqli_connect(...array_values($this->paras));
  18. mysqli_query($this->dbConn,'set names utf8');
  19. }
  20. public function select($table,$fields,$where,$limit)
  21. {
  22. $sqlStr = "select $fields from `$table` where $where limit $limit";
  23. $res = mysqli_query($this->dbConn,$sqlStr);
  24. //把查询结果放在一个二维数组中
  25. foreach($res as $info):
  26. $rows[]=$info;
  27. endforeach;
  28. //返回二维数据
  29. return $rows;
  30. }
  31. public function printInfo($res)
  32. {
  33. foreach($res as $row):
  34. echo '类型:',$row['type'],'<br>';
  35. echo '标题:',$row['title'],'<br>';
  36. echo '内容:',mb_substr($row['content'],0,10),'...','<br>';
  37. echo '联系人:',$row['linkman'],'<br>';
  38. echo '电话:',$row['tel'],'<br>';
  39. echo '发布日期:',$row['edate'],'<br>';
  40. echo '<hr>';
  41. endforeach;
  42. }
  43. //类的对象被序列化的时候触发该方法
  44. public function __sleep()
  45. {
  46. //把数据库连接参数在序列化时返回
  47. return ['paras'];
  48. }
  49. //反序列化 (一个被序列化的该类的对象) 时触发该方法
  50. public function __wakeup()
  51. {
  52. //反序列号时自动连接数据库
  53. $this ->conn();
  54. }
  55. public function __clone()
  56. {
  57. echo '**********克隆了一个新的数据库连接对象********';
  58. echo '<hr>';
  59. }
  60. }
  61. //普通方法连接数据库
  62. $db = new DB();
  63. $res = $db -> select('tb_info','*','type="公寓信息"',1);
  64. $db ->printInfo($res);
  65. //把对象中的数据库连接参数序列化到一个字符串后保存在文件中
  66. $str = serialize($db);
  67. file_put_contents('conn.txt',$str);
  68. //从文件中取出连接参数
  69. $fileStr = file_get_contents('conn.txt');
  70. //反序列化后生成一个数据库连接对象
  71. $db1 = unserialize($fileStr);//生成一个新的数据库连接对象
  72. $res = $db1 -> select('tb_info','*','type="公寓信息"',2);
  73. $db1 ->printInfo($res);
  74. //克隆一个全新的对象
  75. //如果写成$db2 = $db 只是给db起了一个别名db2
  76. $db2 = clone $db; //克隆一个新对象时,触发__clone()方法
  77. $res = $db2 -> select('tb_info','*','type="公寓信息"',3);
  78. $db2 ->printInfo($res);
  79. ?>
  • 代码运行效果图

2.自定义异常类

  1. <?php
  2. //自定义一个异常类,直接返回抛出的异常字符串
  3. class ExCheckUser extends Exception
  4. {
  5. public function __toString()
  6. {
  7. return $this->message;
  8. }
  9. }
  10. //新建一个用户类,包括用户名和密码
  11. class User
  12. {
  13. private $userName;
  14. private $passWord;
  15. public function __construct($userName,$passWord)
  16. {
  17. $this->userName = $userName;
  18. $this->passWord = $passWord;
  19. }
  20. public function checkUser()
  21. {
  22. try
  23. {
  24. if($this ->userName === 'angle'):
  25. if($this ->passWord === '123'):
  26. echo $this ->userName,'登录成功!!!','<br>';
  27. else:
  28. throw new ExCheckUser('密码输入错误');//抛出异常后,调有异常类后执行catch中的语句
  29. endif;
  30. else:
  31. throw new ExCheckUser('用户名输入错误');
  32. endif;
  33. }
  34. catch(ExCheckUser $e)
  35. {
  36. echo $e,'--------------',$this ->userName,'登录失败!!!','<br>';
  37. }
  38. }
  39. }
  40. $user = new User('angle','123');
  41. $user->checkUser();
  42. $user = new User('angle','123456');
  43. $user->checkUser();
  44. $user = new User('hugn','123');
  45. $user->checkUser();
  46. ?>
  • 代码运行效果图

2.匿名类

  1. <?php
  2. //匿名类
  3. //1.用在这个类只是临时调用一次
  4. $user = new class('angle','123')//创建一个匿名类,构造方法传参
  5. {
  6. private $name;
  7. private $passWord;
  8. public function __construct($name,$passWord)
  9. {
  10. $this->name = $name;
  11. $this->passWord = $passWord;
  12. }
  13. public function checkUser()
  14. {
  15. if (($this->name === 'angle')&&($this->passWord ==='123')):
  16. return $this->name.'登录成功';
  17. else:
  18. return $this->name.'登录失败';
  19. endif;
  20. }
  21. };
  22. echo $user ->checkUser();//调用对象中的检测方法
  23. echo '<hr>';
  24. //2.用在函数参数是对象时
  25. function printInfo(object $user)
  26. {
  27. //如果echo一个对象,会触发类的tostring方法
  28. echo $user;
  29. }
  30. echo printInfo(new class{
  31. public function __toString()
  32. {
  33. return 'hello 我是一个类';
  34. }
  35. })
  36. ?>
  • 代码运行效果图
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议