使异常处理变得更灵活、可观察,可以使用设计模式中的观察者模式。
文件 ① 定义观察者的接口
ExceptionObserver.php:
<?php
/*
给观察者定义的规范
*/
interface ExceptionObserver{
public function update(Observer_Exception $e);
}
文件 ② 观察者模式的自定义异常类 Observer_Exception
Observer_Exception.php:
<?php
class Observer_Exception extends Exception{
//保存观察者信息,静态属性
public static $_observer = array();
//添加观察者,静态方法
public static function attach(ExceptionObserver $observer){
//添加成员
self::$_observer[] = $observer;
} //重载父类的构造函数
public function __construct($message = null, $code = 0){
parent::__construct($message, $code);
$this->notify();
} //通知每一个观察者的方法
public function notify(){
foreach(self::$_observer as $observer){
$observer->update($this);
}
}
}
文件 ③ 观察者1.把异常信息记录到文件中
Log_Exception_Observer.php:
<?php
//观察者1.把异常记录到日志文件中
class Log_Exception_Observer implements ExceptionObserver{
protected $_filename = 'D:/practise/php/Error/LogException.log';
public function __construct($filename = null){
if($filename != null && is_string($filename)){
$this->_filename = $filename;
}
} public function update(Observer_Exception $e){
$message = '时间:'.date('Y-m-d H:i:s', time()).PHP_EOL;
$message .= '信息:'.$e->getMessage().PHP_EOL;
$message .= '追踪信息'.$e->getTraceAsString().PHP_EOL;
$message .= '文件'.$e->getFile().PHP_EOL;
$message .= '行号'.$e->getLine().PHP_EOL;
error_log($message, 3, $this->_filename);
}
}
文件 ④ 观察者5.把异常信息通过邮件形式发送给管理员
Email_Exception_Observer.php:
<?php
//观察者2.把异常记录通过邮件形式发送
class Email_Exception_Observer implements ExceptionObserver{
protected $_email = '472323087@qq.com';
public function __construct($email = null){
if($email != null && filter_var($email, FILTER_VALIDATE_EMAIL)){
$this->_email = $email;
}
} public function update(Observer_Exception $e){
$message = '时间:'.date('Y-m-d H:i:s', time()).PHP_EOL;
$message .= '信息:'.$e->getMessage().PHP_EOL;
$message .= '追踪信息'.$e->getTraceAsString().PHP_EOL;
$message .= '文件'.$e->getFile().PHP_EOL;
$message .= '行号'.$e->getLine().PHP_EOL;
error_log($message, 1, $this->_email);
}
}
文件⑤ 测试文件
testObersver.php:
<?php
header('content-type:text/html; charset=utf-8'); require 'ExceptionObserver.php'; //接口
require 'Observer_Exception.php'; //观察者模式的自定义异常类
require 'Log_Exception_Observer.php'; //观察者1
require 'Email_Exception_Observer.php'; //观察者2 //添加观察者,把异常信息记录在文件中
Observer_Exception::attach(new Log_Exception_Observer());//不传参数则保存到默认的文件中 //自定义异常类
class MyException extends Observer_Exception{
public function test(){
echo '测试1:自定义方法处理异常';
}
} //测试
try{
throw new MyException('出现异常,记录');
}catch(MyException $e){
echo $e->getMessage();
echo '<hr>';
$e->test();
}
运行 testObersver.php,输出:
同时文件 LogException.log: