码迷,mamicode.com
首页 > Web开发 > 详细

PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息

时间:2015-07-05 18:17:57      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

使异常处理变得更灵活、可观察,可以使用设计模式中的观察者模式。

 文件 ① 定义观察者的接口

ExceptionObserver.php:

1 <?php
2 /*
3     给观察者定义的规范
4 */
5 interface ExceptionObserver{
6     public function update(Observer_Exception $e);
7 }

 

文件 ② 观察者模式的自定义异常类 Observer_Exception

Observer_Exception.php:

 1 <?php
 2 class Observer_Exception extends Exception{
 3     //保存观察者信息,静态属性
 4     public static $_observer = array();
 5     //添加观察者,静态方法
 6     public static function attach(ExceptionObserver $observer){
 7         //添加成员
 8         self::$_observer[] = $observer;
 9     } 
10 
11     //重载父类的构造函数
12     public function __construct($message = null, $code = 0){
13         parent::__construct($message, $code);
14         $this->notify();
15     }
16 
17     //通知每一个观察者的方法
18     public function notify(){
19         foreach(self::$_observer as $observer){
20             $observer->update($this);
21         }
22     }
23 }

 

文件 ③ 观察者1.把异常信息记录到文件中

Log_Exception_Observer.php:

 1 <?php
 2 //观察者1.把异常记录到日志文件中
 3 class Log_Exception_Observer implements ExceptionObserver{
 4     protected $_filename = ‘D:/practise/php/Error/LogException.log‘;
 5     public function __construct($filename = null){
 6         if($filename != null && is_string($filename)){
 7             $this->_filename = $filename;
 8         }
 9     }
10 
11     public function update(Observer_Exception $e){
12         $message = ‘时间:‘.date(‘Y-m-d H:i:s‘, time()).PHP_EOL;
13         $message .= ‘信息:‘.$e->getMessage().PHP_EOL;
14         $message .= ‘追踪信息‘.$e->getTraceAsString().PHP_EOL;
15         $message .= ‘文件‘.$e->getFile().PHP_EOL;
16         $message .= ‘行号‘.$e->getLine().PHP_EOL;
17         error_log($message, 3, $this->_filename);
18     }
19 }
20  

 

文件 ④ 观察者5.把异常信息通过邮件形式发送给管理员

Email_Exception_Observer.php:

 1 <?php
 2 //观察者2.把异常记录通过邮件形式发送
 3 class Email_Exception_Observer implements ExceptionObserver{
 4     protected $_email = ‘472323087@qq.com‘;
 5     public function __construct($email = null){
 6         if($email != null && filter_var($email, FILTER_VALIDATE_EMAIL)){
 7             $this->_email = $email;
 8         }
 9     }
10 
11     public function update(Observer_Exception $e){
12         $message = ‘时间:‘.date(‘Y-m-d H:i:s‘, time()).PHP_EOL;
13         $message .= ‘信息:‘.$e->getMessage().PHP_EOL;
14         $message .= ‘追踪信息‘.$e->getTraceAsString().PHP_EOL;
15         $message .= ‘文件‘.$e->getFile().PHP_EOL;
16         $message .= ‘行号‘.$e->getLine().PHP_EOL;
17         error_log($message, 1, $this->_email);
18     }
19 }
20  

 

文件⑤ 测试文件

testObersver.php:

 1 <?php
 2 header(‘content-type:text/html; charset=utf-8‘);
 3 
 4 require ‘ExceptionObserver.php‘;    //接口
 5 require ‘Observer_Exception.php‘;    //观察者模式的自定义异常类
 6 require ‘Log_Exception_Observer.php‘;    //观察者1
 7 require ‘Email_Exception_Observer.php‘;        //观察者2
 8 
 9 //添加观察者,把异常信息记录在文件中
10 Observer_Exception::attach(new Log_Exception_Observer());//不传参数则保存到默认的文件中
11 
12 //自定义异常类
13 class MyException extends Observer_Exception{
14     public function test(){
15         echo ‘测试1:自定义方法处理异常‘;
16     }
17 }
18 
19 //测试
20 try{
21     throw new MyException(‘出现异常,记录‘);
22 }catch(MyException $e){
23     echo $e->getMessage();
24     echo ‘<hr>‘;
25     $e->test();
26 }

运行 testObersver.php,输出:

技术分享

 

同时文件 LogException.log:

技术分享

 

PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息

标签:

原文地址:http://www.cnblogs.com/dee0912/p/4621450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!