使用观察者模式处理异常信息,观察者模式
使用观察者模式处理异常信息,观察者模式
异常信息的捕获对编程测试有着重要的意义,这里结合观察者模式,探索如何处理异常信息。
关于观察者模式,如果还没有接触过的话,博客园有很多优秀的博友做了详细的 解释。笔者觉得,所谓观察者模式,必须有两个重要组成部分:一个主题对象,多个观察者。在使用的时候,我们可以将观察者像插头一样插到主题对象这个插座上,利用主题对象完成相应功能。
既然观察者要作为插头,必须要有一个统一的口径才能插到相同的插座上,因而先定义一个接口,Exception_Observer.php:
<?<span>php </span><span>/*</span><span>* * 定义的规范 </span><span>*/</span> <span>interface</span><span> Exception_Observer{ </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>); } </span>?>
相对于众多观察者,我们首先应该关注唯一的主题对象,Observer_Exception.php:
<?<span>php </span><span>class</span> Observer_exception <span>extends</span> <span>Exception</span><span>{ </span><span>public</span> <span>static</span> <span>$_observers</span>=<span>array</span><span>(); </span><span>public</span> <span>static</span> <span>function</span> attach(Exception_Observer <span>$observer</span><span>){ self</span>::<span>$_observers</span>[]=<span>$observer</span><span>; } </span><span>public</span> <span>function</span> __construct(<span>$message</span>=<span>null</span>,<span>$code</span>=0<span>){ parent</span>::__construct(<span>$message</span>,<span>$code</span><span>); </span><span>$this</span>-><span>notify(); } </span><span>public</span> <span>function</span><span> notify(){ </span><span>foreach</span> (self::<span>$_observers</span> <span>as</span> <span>$observer</span><span>) { </span><span>$observer</span>->update(<span>$this</span><span>); } } }</span>
我们可以清楚地看到,静态变量$_observers用来放置插入的观察者,notify()用来通知所有观察者对象。
这里需要注意 $observer->update($this); 里面 $this 的用法,很多初学者会感到“原来 $this 也可以这么用啊”。
一个小问题: $_observers 不是静态变量可不可以? 这个问题我们后面回答。
定义两个观察者,原则上实现接口所定义的功能。
Email_Exception_Observer.php:
<span>class</span> Emailing_Exception_Observer <span>implements</span><span> Exception_Observer{ </span><span>protected</span> <span>$_email</span>="huanggbxjp@sohu.com"<span>; </span><span>function</span> __construct(<span>$email</span>=<span>null</span><span>) { </span><span>if</span> (<span>$email</span>!==<span>null</span>&&filter_var(<span>$email</span>,<span>FILTER_VALIDATE_EMAIL)) { </span><span>$this</span>->_email=<span>$email</span><span>; } } </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>){ </span><span>$message</span>="时间".<span>date</span>("Y-m-d H:i:s").<span>PHP_EOL</span><span>; </span><span>$message</span>.="信息".<span>$e</span>->getMessage().<span>PHP_EOL</span><span>; </span><span>$message</span>.="追踪信息".<span>$e</span>->getTraceAsString().<span>PHP_EOL</span><span>; </span><span>$message</span>.="文件".<span>$e</span>->getFile().<span>PHP_EOL</span><span>; </span><span>$message</span>.="行号".<span>$e</span>->getLine().<span>PHP_EOL</span><span>; </span><span>error_log</span>(<span>$message</span>,1,<span>$this</span>-><span>_email); } }</span>
Logging_Exception_Observer.php:
<?<span>php </span> <span>class</span> Logging_Exception_Observer <span>implements</span><span> Exception_Observer { </span><span>protected</span> <span>$_filename</span>="F:/logException.log"<span>; </span><span>function</span> __construct(<span>$filename</span>=<span>null</span><span>) { </span><span>if</span> (<span>$filename</span>!==<span>null</span>&&<span>is_string</span>(<span>$filename</span><span>)) { </span><span>$thvis</span>->_filename=<span>$filename</span><span>; } } </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>){ </span><span>$message</span>="时间".<span>date</span>("Y-m-d H:i:s").<span>PHP_EOL</span><span>; </span><span>$message</span>.="信息".<span>$e</span>->getMessage().<span>PHP_EOL</span><span>; </span><span>$message</span>.="追踪信息".<span>$e</span>->getTraceAsString().<span>PHP_EOL</span><span>; </span><span>$message</span>.="文件".<span>$e</span>->getFile().<span>PHP_EOL</span><span>; </span><span>$message</span>.="行号".<span>$e</span>->getLine().<span>PHP_EOL</span><span>; </span><span>error_log</span>(<span>$message</span>,3,<span>$this</span>-><span>_filename); } }</span>
设计完所有该有的主体对象和插件,我们做个小小的测试:
<?<span>php </span><span>require</span> 'Exception_Observer.php'<span>; </span><span>require</span> 'Observer_Exception.php'<span>; </span><span>require</span> 'Logging_Exception_Observer.php'<span>; </span><span>require</span> 'Emailing_Exception_Observer.php'<span>; Observer_Exception</span>::attach(<span>new</span><span> Logging_Exception_Observer()); </span><span>class</span> MyException <span>extends</span><span> Observer_Exception{ </span><span>public</span> <span>function</span><span> test(){ </span><span>echo</span> 'this is a test'<span>; } </span><span>public</span> <span>function</span><span> test1(){ </span><span>echo</span> "我是自定义的方法处理这个异常"<span>; } } </span><span>try</span><span> { </span><span>throw</span> <span>new</span> MyException("出现异常,记录一下"<span>); } </span><span>catch</span> (MyException <span>$e</span><span>) { </span><span>echo</span> <span>$e</span>-><span>getMessage(); </span><span>echo</span> "<ht/>"<span>; } </span>?>
本实例首先先加载观察者,其后进行其他操作。回到上面提出的问题, $_observers 可以不是静态变量吗?答案是不可以。如果 $_observers 不是静态变量,加载观察者的行为对后续操作没有影响。static让所有实例成员共享某个变量。即便类继承也同样有效。有兴趣的可以继续探索下static的神奇作用吧。
本例显示输出与一般情况无异,但不同的是已在自定义的文件下生成了相应的日志。虽然最后实现的功能再简单不过,很多人甚至可以用更少的代码更简单的方法实现,但是,在实现更加复杂系统的情况下,观察者模式给我们带来很大方便。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











はじめに PHP デザイン パターンは、ソフトウェア開発における一般的な課題に対する実証済みのソリューションのセットです。これらのパターンに従うことで、開発者はエレガントで堅牢かつ保守しやすいコードを作成できます。これらは、開発者が SOLID 原則 (単一責任、オープン/クローズ、リスコフ置換、インターフェイスの分離、依存関係の反転) に従うのに役立ち、それによってコードの可読性、保守性、拡張性が向上します。デザイン パターンの種類 さまざまなデザイン パターンがあり、それぞれに独自の目的と利点があります。最も一般的に使用される PHP 設計パターンの一部を次に示します。 シングルトン パターン: クラスにインスタンスが 1 つだけあることを保証し、このインスタンスにグローバルにアクセスする方法を提供します。ファクトリ パターン: 正確なクラスを指定せずにオブジェクトを作成します。これにより、開発者は条件付きで次のことを行うことができます。

イベント マネージャー (EventManager) を使用して Phalcon フレームワークでオブザーバー パターンを実装する方法 はじめに: イベント マネージャー (EventManager) は、Phalcon フレームワークの強力で柔軟なコア機能の 1 つです。イベント マネージャーを使用すると、Observer パターンを簡単に実装して、アプリケーション内のオブジェクト間の疎結合を実現できます。この記事では、Phalcon フレームワークでイベント マネージャーを使用してオブザーバー パターンを実装する方法を紹介し、対応するコード例を示します。第一歩

デザイン パターンは、現代のソフトウェア開発で広く使用されている概念です。デザイン パターンは、ソフトウェア システムに見られる一般的なソリューションであり、開発者が複雑なソフトウェア アプリケーションをより効率的に構築できるようにテストされ証明されています。オブザーバー パターンは最も一般的なデザイン パターンの 1 つであり、PHP 開発者が習得する必要がある重要な概念でもあります。この記事では、Observer パターンの概念と実装を紹介し、PHP アプリケーションでの使用方法を示します。オブザーバーパターンとは何ですか?オブザーバーパターンは、

Java プログラミング スキルの向上: アダプター モードとオブザーバー モードの実装をマスターし、特定のコード サンプルが必要です。 はじめに: 日常のソフトウェア開発では、異なるクラス間の互換性の問題に対処する必要があり、さまざまなユーザー インターフェイスを実装する必要もあります。 イベントの監視と処理。アダプター パターンとオブザーバー パターンは、これらの問題を効果的に解決できる 2 つの一般的に使用される設計パターンです。この記事では、アダプター パターンとオブザーバー パターンの実装を詳しく紹介し、読者の理解を深めるために具体的な Java コード例を示します。 1つ、

PHP オブジェクト指向プログラミングにおけるオブザーバー パターンの詳細な分析 オブザーバー パターンは、ソフトウェア システムのオブジェクト間の疎結合を実現するためによく使用される設計パターンです。その中心的な考え方は次のとおりです: オブジェクト (オブザーバーまたはサブジェクトと呼ばれます) は、それに依存するオブジェクト (オブザーバーと呼ばれます) のリストを維持します。監視されているオブジェクトの状態が変化すると、すべてのオブザーバーに自動的に通知されます。このようにして、オブザーバー パターンはオブジェクト間の 1 対多の関係を実装できます。オブジェクトが変更されると、関連するすべてのオブジェクトに通知され、

1. PHP デザインパターンとは何ですか? PHP デザイン パターンは、一般的なソフトウェア開発の問題を解決するために設計された事前定義されたコード テンプレートです。これらは、コードの再利用性、保守性、拡張性を向上させる実証済みのソリューションを提供します。 2. PHP デザインパターンの種類 PHP にはさまざまなデザインパターンがあり、それぞれのパターンには特定の目的があります。最も一般的なパターンは次のとおりです。 シングルトン パターン: クラスのインスタンスが 1 つだけ存在することを保証します。ファクトリ パターン: 渡されたデータに基づいて、さまざまなタイプのオブジェクトを作成します。ストラテジー モード: プログラムが実行時に動作を変更できるようにします。オブザーバー パターン: オブジェクトがイベントをサブスクライブし、イベントが発生したときに通知を受け取ることができます。 3. シングルトンモードの例 classSingleInstance{private

PHP のオブザーバー パターンとその使用例の説明 オブザーバー パターンは、オブジェクト間に 1 対多の依存関係を確立するために使用されるソフトウェア設計パターンです。このモードでは、オブジェクトの状態が変化すると、そのオブジェクトに依存するすべてのオブジェクトが通知され、自動的に更新されます。 PHP プログラミングでは、オブザーバー パターンは、コードの最適化と簡素化、コードの読みやすさと保守性の向上に役立つ一般的に使用される設計パターンです。以下では、PHP のオブザーバー パターンの基本的なメソッドを紹介し、その使用法を例を示して説明します。オブザーバー パターンの基本

Java フレームワークのオブザーバー パターンは、インターフェイスと抽象クラスを通じて動作を定義します (1)。サブジェクト クラスとオブザーバー クラスは、管理と応答の動作を実装します (2)。サブジェクトは、サブスクリプション メソッドとキャンセル メソッドを提供し、オブザーバー コレクションを維持し、オブザーバーに通知します (3)。この例では、Subject はオブザーバーを管理してイベントをトリガーし (4)、ConcreteObserver はイベントに応答します (5)。
