PHP使用观察者模式处理异常信息的方法详解
作者:杰枫Jeff 发布时间:2023-10-19 15:53:30
本文实例讲述了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程序设计有所帮助。
来源:https://www.cnblogs.com/DeanChopper/p/4726773.html
猜你喜欢
- 前言vue是现在很火的一个前端MVVM框架,它以数据驱动和组件化的思想构建,与angular和react并称前端三大框架。相比angular
- 本文实例为大家分享了基于TensorFlow的CNN实现Mnist手写数字识别的具体代码,供大家参考,具体内容如下一、CNN模型结构输入层:
- Mysql数据库是一个多用户,多线程的关系型数据库,是一个客户机/服务器结构的应用程序。它是对个人用户和商业用户是免费的.Mysql数据库具
- 注:此功能依赖GD2图形库最近要用php生成缩略图,在网上找了一下,发现了这篇文章:PHP生成图片缩略图试用了一下后,发现有这样几个问题:1
- 【原文地址】New "Orcas" Language Feature: Extension Methods【原文发表日期
- 一、subprocess以及常用的封装函数运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一
- 1、看机器配置,指三大件:cpu、内存、硬盘2、看mysql配置参数3、查系mysql行状态,可以用mysqlreport工具来查看4、查看
- python如何建立一个自己的包一些概念模块:我们写的每个py都是一个模块包:模块的集合,就是一个包,通常包和directory的区别在于是
- 本文实例讲述了vue实现图片懒加载的方法。分享给大家供大家参考,具体如下:vue图片懒加载使用首先第一步,安装插件vue-lazyloadn
- 他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询. 翻了手册,找到了下面这个语句,可以完成任务了,但效率较低SELECT&n
- 记录一下:# Three loss functionscategory_predict1 = Dense(100, activation=&
- 本文转自:https://blog.csdn.net/qq_42730750/article/details/108415551前言 各大
- 接着上一篇,这里继续整合交易类。import datetime#交易类,后期需要整合公钥,私钥class Transaction: &nbs
- Python 2.x 很快就要 失去官方支持 了,尽管如此,从 Python 2 迁移到 Python 3 却并没有想象中那么难。我在上周用
- 之前在写连表查询的时候,老是分不清楚where和on的区别,导致有时写的SQL会出现一点小的问题,这里专门写篇文章做下记录,如果你也分不清,
- mysql版本号是5.7.28,表A有390W条记录,使用InnoDB引擎,其中varchar类型字段mac已建立索引,索引方法为B-tre
- 本文实例讲述了Go语言写入字符串到文件的方法。分享给大家供大家参考。具体实现方法如下:package mainimport &q
- # -*- coding: UTF-8 -*-from __future__ import unicode_literalsimport I
- D:document 文档 浏览器加载的页面 DOM O:object 对象 页面及页面中的任何元素都是对象 M:module 模型 页面中
- 本文实例为大家分享了Django实现分页功能,为了容易区别功能的展现,先创建一个数据库,用数据库中的数据做演示。创建数据库步骤如下:1.创建