/**
* 给观察者定义规范
*
* Interface Exception_Observer
*/
interface Exception_Observer
{
public function update(Observable_Exception $e);
}
/**
* 定义观察者
* Class Observable_Exception
*/
class Observable_Exception extends Exception
{
//保存观察者信息
public static $_observers = array();
public static function attach(Exception_Observer $observer)
{
self::$_observers[] = $observer;
}
public function __construct($message = "", $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
$this->notify();
}
public function notify()
{
foreach (self::$_observers as $observer) {
$observer->update($this);
}
}
}
/**
* 记录错误日志
*/
class Logging_Exception_Observer implements Exception_Observer
{
protected $_filename = __DIR__.'/error_observer.log';
public function __construct($filename = null)
{
if ($filename!==null && is_string($filename)){
$this->_filename = $filename;
}
}
public function update(Observable_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);//写到日志中
}
}
/**
* 测试
*/
header('content-type:text/html;charset=utf-8');
require_once 'Exception_Observer.php';
require_once 'Logging_Exception_Observer.php';
require_once 'Observable_Exception.php';
Observable_Exception::attach(new Logging_Exception_Observer());
class MyException extends Observable_Exception{
public function test1()
{
echo 'this is a test';
}
}
try{
throw new MyException('出现了异常!');
}catch (MyException $exception){
echo $exception->getMessage();
}
/**
* 给观察者定义规范
*
* Interface Exception_Observer
*/
interface Exception_Observer
{
public function update(Observable_Exception $e);
}
/**
* 定义观察者
* Class Observable_Exception
*/
class Observable_Exception extends Exception
{
//保存观察者信息
public static $_observers = array();
public static function attach(Exception_Observer $observer)
{
self::$_observers[] = $observer;
}
public function __construct($message = "", $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
$this->notify();
}
public function notify()
{
foreach (self::$_observers as $observer) {
$observer->update($this);
}
}
}
/**
* 记录错误日志
*/
class Logging_Exception_Observer implements Exception_Observer
{
protected $_filename = __DIR__.'/error_observer.log';
public function __construct($filename = null)
{
if ($filename!==null && is_string($filename)){
$this->_filename = $filename;
}
}
public function update(Observable_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);//写到日志中
}
}
/**
* 测试
*/
header('content-type:text/html;charset=utf-8');
require_once 'Exception_Observer.php';
require_once 'Logging_Exception_Observer.php';
require_once 'Observable_Exception.php';
Observable_Exception::attach(new Logging_Exception_Observer());
class MyException extends Observable_Exception{
public function test1()
{
echo 'this is a test';
}
}
try{
throw new MyException('出现了异常!');
}catch (MyException $exception){
echo $exception->getMessage();
}