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 相关文章推荐
一个可以找出源代码中所有中文的工具
Oct 25 PHP
自动把纯文本转换成Web页面的php代码
Aug 27 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
通过curl模拟post和get方式提交的表单类
Apr 23 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
Jan 07 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
PHP实现 APP端微信支付功能
Jun 22 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
利用PHP创建动态图像
2006/10/09 PHP
php中随机显示图片的函数代码
2011/06/23 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
受欢迎的大学生自我评价
2013/12/05 职场文书
平面设计岗位职责
2013/12/14 职场文书
商超业务员岗位职责
2014/03/12 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
内乡县衙导游词
2015/02/05 职场文书
升职自荐信范文
2015/03/27 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python