使异常处理变得更灵活、可观察,可以使用设计模式中的观察者模式。
文件 ① 定义观察者的接口
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 = ‘[email protected]‘; 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:
时间: 2024-10-24 04:46:17