博客列表 >__sleep()、__wakeup() 魔术方法与异常处理示例

__sleep()、__wakeup() 魔术方法与异常处理示例

若是梦终会醒
若是梦终会醒原创
2020年05月07日 11:02:23928浏览

1 __sleep()、__wakeup() 魔术方法

  1. __sleep():当序列化的时候自动调用
  2. __wakeup():当反序列化的时候自动调用

示例:

  1. <?php
  2. class Demo {
  3. private $name;
  4. private $sex;
  5. private $msg='PHP中文网11期';
  6. public function __construct($name,$sex) {
  7. $this->name=$name;
  8. $this->sex=$sex;
  9. }
  10. /**
  11. *序列化的时候自动调用
  12. *@return array 序列化的属性名
  13. */
  14. public function __sleep() {
  15. return array('name','sex');
  16. }
  17. //反序列化的时候自动调用
  18. public function __wakeup() {
  19. $this->type='学员';
  20. }
  21. }
  22. //测试
  23. $demo=new Demo('许先生','男');
  24. $str=serialize($demo); //序列化
  25. $demo=unserialize($str); //反序列化
  26. $res=print_r($demo,true);
  27. printf('<pre>%s</pre>',$res);

效果图:

2 异常处理

集中处理在代码块中发生的异常。

在代码块中发生了异常直接抛出,代码块中不处理异常,将异常集中起来一起处理。

2.1 使用的关键字

  1. try:监测代码块
  2. catch:捕获异常
  3. throw:抛出异常
  4. finally:无论有无异常都会执行,可以省略
  5. Exception:异常类

语法结构

  1. try{
  2. //检测代码
  3. }catch(Exception $ex){
  4. //捕获异常
  5. }
  6. finally{
  7. //不论是否有异常,都要执行,finally可以省略
  8. }

示例:

  1. <?php
  2. if (isset($_POST['button'])) {
  3. try {
  4. $username = $_POST['username'];
  5. if ($username == '')
  6. throw new Exception('用户名不能为空', 1024); //抛出异常
  7. if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $username))
  8. throw new Exception('用户名不能为中文', 1025); //抛出异常
  9. if (!preg_match("/^[^\d\-.,:]/", $username))
  10. throw new Exception('用户名不能以数字和特殊字符开头', 1026); //抛出异常
  11. if (!(strlen($username) >= 3 && strlen($username) <= 12))
  12. throw new Exception('用户名长度只能值3-12之间', 1027); //抛出异常
  13. echo'提交成功您的用户名为', "{$username}", '<br>';
  14. } catch (Exception $ex) { //捕获异常
  15. echo '错误信息:' . $ex->getMessage(), '<br>';
  16. echo '错误码:' . $ex->getCode(), '<br>';
  17. echo '文件地址:' . $ex->getFile(), '<br>';
  18. echo '错误行号:' . $ex->getLine(), '<br>';
  19. } finally {
  20. echo '关闭数据库连接'; //不管是否有异常,finally都要执行
  21. }
  22. }
  23. ?>
  24. <form method="post" action="">
  25. 用户名: <input type="text" name="username" value="<?=@$username ?>"> <br />
  26. <input type="submit" name="button" value="提交">
  27. </form>

效果图:

2.2 自定义异常

场景:如果实现异常的分类处理?比如异常有三个级别异常对应三种处理方式

自定义三种异常即可

所有异常类的父类是Exception,Exception中的方法不允许重写

  1. <?php
  2. //自定义空异常类
  3. class MyNullException extends Exception {
  4. }
  5. //自定义类型异常
  6. class MyTypeException extends Exception {
  7. }
  8. //自定义范围异常
  9. class MyRangeException extends Exception {
  10. }
  11. //逻辑代码
  12. if(isset($_POST['button'])) {
  13. try{
  14. $username = $_POST['username'];
  15. if ($username == '')
  16. throw new MyNullException('用户名不能为空', 1024); //抛出异常
  17. if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $username))
  18. throw new MyTypeException('用户名不能为中文', 1025); //抛出异常
  19. if (!preg_match("/^[^\d\-.,:]/", $username))
  20. throw new MyTypeException('用户名不能以数字和特殊字符开头', 1026); //抛出异常
  21. if (!(strlen($username) >= 3 && strlen($username) <= 12))
  22. throw new MyRangeException('用户名长度只能值3-12之间', 1027); //抛出异常
  23. echo'提交成功您的用户名为', "{$username}", '<br>';
  24. }catch(MyNullException $ex){
  25. echo $ex->getMessage(),'<br>';
  26. echo '错误记录在日志中';
  27. }catch(MyTypeException $ex){
  28. echo $ex->getMessage(),'<br>';
  29. echo '发送电子邮件';
  30. }catch(MyRangeException $ex){
  31. echo $ex->getMessage(),'<br>';
  32. echo '给管理员打电话';
  33. }
  34. }
  35. ?>
  36. <form method="post" action="">
  37. 用户名: <input type="text" name="username" value="<?=@$username ?>"> <br />
  38. <input type="submit" name="button" value="提交">
  39. </form>

效果图:

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