批改状态:合格
老师批语:从总结看出, 理解的很深入, 就剩下实战了
异常处理通常用在指定的错误(异常)情况发生时改变脚本的正常流程,这种情况称为异常。
当异常被触发时,代码执行被切换到预定义的异常处理器函数
这里演示一个模拟用户登录与验证的案例:
class nameException extends Exception{public function errorMessage(){echo '账号或密码不对';}}// 验证不对时调用这个类class passException extends Exception{public function testMessage(){echo '验证错误';}}$name = 12;$password = 123;$test = 12;// 使用异常的函数应该位于`try`代码块内,如果没有触发异常,则正常执行,如果出现错误,则抛出一个异常try{// 当账号不对时,抛出一个异常if($name != 123 || $password != 123):throw new nameException();// 当验证码不对时,抛出一个异常elseif ($test != 123):throw new passException();// 当它们都不对时,调用顶级异常类else:throw new Exception('当前用户不存在!');endif;}// 通常一个`throw`必须对于至少一个`catch`catch(nameException $e){echo $e->errorMessage();}catch(passException $e){echo $e->testMessage();}catch(Exception $e){echo $e->getMessage();}
输出账号或密码不对
__sleep()与__wakeup()是魔术方法的一种。
触发事件:对象被序列化之前
作用:返回需要序列化存储的成员属性,删减不必要
返回:array需要被序列化存储的成员属性数组
触发事件:类的实例的序列化串被序列化时
作用:预先准备对象资源
返回:void
示例:
class Connection{protected $link;private $params = [];// 构造方法public function _construct($dsn,$username,$password){$this->params['dsn'] = $dsn;$this->params['username'] = $username;$this->params['password'] = $password;$this->connect();}public function connect(){$this -> link = new PDO(...array_values($this->params));}// 序列化时自动重新链接public function __sleep(){return ['params'];}// 反序列化时自动重新链接public function __wakeup(){$this->connect();}// 测试public function select($sql){return $this->link->query($sql)->fetchAll(PDO::FETCH_ASSOC);}}// 客户端$db = new Connection('mysql:host=localhost;dbname=message','1','123456');print_r($db->select('select * from message limit3'));echo '<hr>';$str = serialize($db);echo $str.'<br>';// 反序列化,会重新返回一个新对象,所以要重新链接才能查询$obj = unserialize($str);print_r($obj->select('select * from message limit 3'));
对脚本的异常处理有了基本认识,知道如何自定义一个异常类,调用自定义方法,对代码调试时,又知道了一种方法,不再靠基本的echo,var_dump,print打印错误,异常处理的好处能进行大量的代码块处理。__sleep和__wakeup都用在对象的序列化操作。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号