PHP使用观察者模式处理异常信息的方法详解


Posted in PHP onSeptember 24, 2019

本文实例讲述了PHP使用观察者模式处理异常信息的方法。分享给大家供大家参考,具体如下:

异常信息的捕获对编程测试有着重要的意义,这里结合观察者模式,探索如何处理异常信息。

关于观察者模式,如果还没有接触过的话,博客园有很多优秀的博友做了详细的 解释。笔者觉得,所谓观察者模式,必须有两个重要组成部分:一个主题对象,多个观察者。在使用的时候,我们可以将观察者像插头一样插到主题对象这个插座上,利用主题对象完成相应功能。

既然观察者要作为插头,必须要有一个统一的口径才能插到相同的插座上,因而先定义一个接口,Exception_Observer.php:

<?php
/**
 * 定义的规范
 */
interface Exception_Observer{
  public function update(Observer_Exception $e);
}
?>

相对于众多观察者,我们首先应该关注唯一的主题对象,Observer_Exception.php:

<?php
class Observer_exception extends Exception{
  public static $_observers=array();
  public static function attach(Exception_Observer $observer){
    self::$_observers[]=$observer;
  }
  public function __construct($message=null,$code=0){
    parent::__construct($message,$code);
    $this->notify();
  }
  public function notify(){
    foreach (self::$_observers as $observer) {
      $observer->update($this);
    }
  }
}

我们可以清楚地看到,静态变量$_observers用来放置插入的观察者,notify()用来通知所有观察者对象。

这里需要注意 $observer->update($this); 里面 $this 的用法,很多初学者会感到“原来 $this 也可以这么用啊”。

一个小问题: $_observers 不是静态变量可不可以? 这个问题我们后面回答。

定义两个观察者,原则上实现接口所定义的功能。

Email_Exception_Observer.php:

class Emailing_Exception_Observer implements Exception_Observer{
  protected $_email="huanggbxjp@sohu.com";
  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").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);
  }
}

Logging_Exception_Observer.php:

<?php
class Logging_Exception_Observer implements Exception_Observer
{
  protected $_filename="F:/logException.log";
  function __construct($filename=null)
  {
    if ($filename!==null&&is_string($filename)) {
      $thvis->_filename=$filename;
    }
  }
  public function update(Observer_Exception $e){
    $message="时间".date("Y-m-d H:i:s").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);
  }
}

设计完所有该有的主体对象和插件,我们做个小小的测试:

<?php
require 'Exception_Observer.php';
require 'Observer_Exception.php';
require 'Logging_Exception_Observer.php';
require 'Emailing_Exception_Observer.php';
Observer_Exception::attach(new Logging_Exception_Observer());
class MyException extends Observer_Exception{
  public function test(){
    echo 'this is a test';
  }
  public function test1(){
    echo "我是自定义的方法处理这个异常";
  }
}
try {
  throw new MyException("出现异常,记录一下");
} catch (MyException $e) {
  echo $e->getMessage();
  echo "<ht/>";
}
?>

本实例首先先加载观察者,其后进行其他操作。回到上面提出的问题, $_observers 可以不是静态变量吗?答案是不可以。如果 $_observers 不是静态变量,加载观察者的行为对后续操作没有影响。static让所有实例成员共享某个变量。即便类继承也同样有效。有兴趣的可以继续探索下static的神奇作用吧。

本例显示输出与一般情况无异,但不同的是已在自定义的文件下生成了相应的日志。虽然最后实现的功能再简单不过,很多人甚至可以用更少的代码更简单的方法实现,但是,在实现更加复杂系统的情况下,观察者模式给我们带来很大方便。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
编写PHP的安全策略
Oct 09 PHP
一个域名查询的程序
Oct 09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
探讨PHP中this,self,parent的区别详解
Jun 08 PHP
解析php中如何直接执行SHELL
Jun 28 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
yii去掉必填项中星号的方法
Dec 28 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
PHP7内核之Reference详解
Mar 14 PHP
php连接sftp的作用以及实例代码
Sep 23 #PHP
php依赖注入知识点详解
Sep 23 #PHP
php引用和拷贝的区别知识点总结
Sep 23 #PHP
php异常处理捕获错误整理
Sep 23 #PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 #PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
Sep 23 #PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 #PHP
You might like
ip签名探针
2006/10/09 PHP
PHP 程序员应该使用的10个组件
2009/10/31 PHP
深入PHP数据加密详解
2013/06/18 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
js 对象是否存在判断
2009/07/15 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
怎么清空javascript数组
2013/05/11 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
2015/09/11 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
Python Django 命名空间模式的实现
2019/08/09 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
python 日志 logging模块详细解析
2020/03/31 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
公司中层干部的自我评价分享
2014/03/01 职场文书
企业新年寄语
2014/04/04 职场文书
梅花魂教学反思
2014/04/25 职场文书
队列队形口号
2015/12/25 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
python本地文件服务器实例教程
2021/05/02 Python
教你怎么用Python操作MySql数据库
2021/05/31 Python
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android