博客列表 >php异常处理与sleep(),wakeup()

php异常处理与sleep(),wakeup()

Jason
Jason原创
2020年05月06日 23:45:49858浏览

php异常类与sleep(),wakeup()

php异常处理

异常处理通常用在指定的错误(异常)情况发生时改变脚本的正常流程,这种情况称为异常。

当异常被触发时,代码执行被切换到预定义的异常处理器函数

这里演示一个模拟用户登录与验证的案例:

  1. class nameException extends Exception
  2. {
  3. public function errorMessage()
  4. {
  5. echo '账号或密码不对';
  6. }
  7. }
  8. // 验证不对时调用这个类
  9. class passException extends Exception
  10. {
  11. public function testMessage()
  12. {
  13. echo '验证错误';
  14. }
  15. }
  16. $name = 12;
  17. $password = 123;
  18. $test = 12;
  19. // 使用异常的函数应该位于`try`代码块内,如果没有触发异常,则正常执行,如果出现错误,则抛出一个异常
  20. try{
  21. // 当账号不对时,抛出一个异常
  22. if($name != 123 || $password != 123):
  23. throw new nameException();
  24. // 当验证码不对时,抛出一个异常
  25. elseif ($test != 123):
  26. throw new passException();
  27. // 当它们都不对时,调用顶级异常类
  28. else:
  29. throw new Exception('当前用户不存在!');
  30. endif;
  31. }
  32. // 通常一个`throw`必须对于至少一个`catch`
  33. catch(nameException $e)
  34. {
  35. echo $e->errorMessage();
  36. }
  37. catch(passException $e)
  38. {
  39. echo $e->testMessage();
  40. }
  41. catch(Exception $e)
  42. {
  43. echo $e->getMessage();
  44. }

输出
账号或密码不对

sleep()与wakeup()

__sleep()__wakeup()是魔术方法的一种。

_sleep()

触发事件:对象被序列化之前
作用:返回需要序列化存储的成员属性,删减不必要
返回:array需要被序列化存储的成员属性数组

__wakeup()

触发事件:类的实例的序列化串被序列化时
作用:预先准备对象资源
返回:void

示例:

  1. class Connection
  2. {
  3. protected $link;
  4. private $params = [];
  5. // 构造方法
  6. public function _construct($dsn,$username,$password)
  7. {
  8. $this->params['dsn'] = $dsn;
  9. $this->params['username'] = $username;
  10. $this->params['password'] = $password;
  11. $this->connect();
  12. }
  13. public function connect()
  14. {
  15. $this -> link = new PDO(...array_values($this->params));
  16. }
  17. // 序列化时自动重新链接
  18. public function __sleep()
  19. {
  20. return ['params'];
  21. }
  22. // 反序列化时自动重新链接
  23. public function __wakeup()
  24. {
  25. $this->connect();
  26. }
  27. // 测试
  28. public function select($sql)
  29. {
  30. return $this->link->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  31. }
  32. }
  33. // 客户端
  34. $db = new Connection('mysql:host=localhost;dbname=message','1','123456');
  35. print_r($db->select('select * from message limit3'));
  36. echo '<hr>';
  37. $str = serialize($db);
  38. echo $str.'<br>';
  39. // 反序列化,会重新返回一个新对象,所以要重新链接才能查询
  40. $obj = unserialize($str);
  41. print_r($obj->select('select * from message limit 3'));

总结

对脚本的异常处理有了基本认识,知道如何自定义一个异常类,调用自定义方法,对代码调试时,又知道了一种方法,不再靠基本的echovar_dump,print打印错误,异常处理的好处能进行大量的代码块处理。__sleep__wakeup都用在对象的序列化操作。

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