オブザーバー パターンを使用して例外情報を処理します
例外情報のキャプチャは、プログラミング テストにとって非常に重要です。ここでは、オブザーバー パターンと組み合わせて、例外情報を処理する方法を検討します。
オブザーバー モードについてまだご存じない方は、ブログ ガーデンに多くの優れたブロガーが詳しく説明しています。著者は、いわゆるオブザーバー パターンには 2 つの重要なコンポーネントが必要であると感じています。それは、サブジェクト オブジェクトと複数のオブザーバーです。これを使用する場合、オブザーバーをプラグのようにテーマ オブジェクトのソケットに接続し、テーマ オブジェクトを使用して対応する機能を実行できます。
オブザーバーはプラグとして使用されるため、同じソケットに接続するには統一された口径が必要です。そのため、最初にインターフェイス Exception_Observer.php:
<?<span style="color: #000000;">php </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * 定义的规范 </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> Exception_Observer{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> update(Observer_Exception <span style="color: #800080;">$e</span><span style="color: #000000;">);} </span>?>
<?<span style="color: #000000;">php</span><span style="color: #0000ff;">class</span> Observer_exception <span style="color: #0000ff;">extends</span> <span style="color: #0000ff;">Exception</span><span style="color: #000000;">{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #800080;">$_observers</span>=<span style="color: #0000ff;">array</span><span style="color: #000000;">(); </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> attach(Exception_Observer <span style="color: #800080;">$observer</span><span style="color: #000000;">){ self</span>::<span style="color: #800080;">$_observers</span>[]=<span style="color: #800080;">$observer</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$message</span>=<span style="color: #0000ff;">null</span>,<span style="color: #800080;">$code</span>=0<span style="color: #000000;">){ parent</span>::__construct(<span style="color: #800080;">$message</span>,<span style="color: #800080;">$code</span><span style="color: #000000;">); </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">notify(); } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> notify(){ </span><span style="color: #0000ff;">foreach</span> (self::<span style="color: #800080;">$_observers</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$observer</span><span style="color: #000000;">) { </span><span style="color: #800080;">$observer</span>->update(<span style="color: #800080;">$this</span><span style="color: #000000;">); } }}</span>
$observer->update($this); 内の $this の使い方について、多くの初心者は「$thisもこんな使い方ができることが分かった」と感じるでしょう。
ちょっとした質問:$_observers 静的変数でなくても大丈夫ですか? この質問については後でお答えします。
2 つのオブザーバーを定義します。原則として、インターフェースによって定義された関数を実装します。 Email_Exception_Observer.php:<span style="color: #0000ff;">class</span> Emailing_Exception_Observer <span style="color: #0000ff;">implements</span><span style="color: #000000;"> Exception_Observer{ </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_email</span>="[email protected]"<span style="color: #000000;">; </span><span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$email</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$email</span>!==<span style="color: #0000ff;">null</span>&&filter_var(<span style="color: #800080;">$email</span>,<span style="color: #000000;">FILTER_VALIDATE_EMAIL)) { </span><span style="color: #800080;">$this</span>->_email=<span style="color: #800080;">$email</span><span style="color: #000000;">; } } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> update(Observer_Exception <span style="color: #800080;">$e</span><span style="color: #000000;">){ </span><span style="color: #800080;">$message</span>="时间".<span style="color: #008080;">date</span>("Y-m-d H:i:s").<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #800080;">$message</span>.="信息".<span style="color: #800080;">$e</span>->getMessage().<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #800080;">$message</span>.="追踪信息".<span style="color: #800080;">$e</span>->getTraceAsString().<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #800080;">$message</span>.="文件".<span style="color: #800080;">$e</span>->getFile().<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #800080;">$message</span>.="行号".<span style="color: #800080;">$e</span>->getLine().<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #008080;">error_log</span>(<span style="color: #800080;">$message</span>,1,<span style="color: #800080;">$this</span>-><span style="color: #000000;">_email); }}</span>
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">class</span> Logging_Exception_Observer <span style="color: #0000ff;">implements</span><span style="color: #000000;"> Exception_Observer{ </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$_filename</span>="F:/logException.log"<span style="color: #000000;">; </span><span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$filename</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$filename</span>!==<span style="color: #0000ff;">null</span>&&<span style="color: #008080;">is_string</span>(<span style="color: #800080;">$filename</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$thvis</span>->_filename=<span style="color: #800080;">$filename</span><span style="color: #000000;">; } } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> update(Observer_Exception <span style="color: #800080;">$e</span><span style="color: #000000;">){ </span><span style="color: #800080;">$message</span>="时间".<span style="color: #008080;">date</span>("Y-m-d H:i:s").<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #800080;">$message</span>.="信息".<span style="color: #800080;">$e</span>->getMessage().<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #800080;">$message</span>.="追踪信息".<span style="color: #800080;">$e</span>->getTraceAsString().<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #800080;">$message</span>.="文件".<span style="color: #800080;">$e</span>->getFile().<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #800080;">$message</span>.="行号".<span style="color: #800080;">$e</span>->getLine().<span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">; </span><span style="color: #008080;">error_log</span>(<span style="color: #800080;">$message</span>,3,<span style="color: #800080;">$this</span>-><span style="color: #000000;">_filename); }}</span>
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">require</span> 'Exception_Observer.php'<span style="color: #000000;">;</span><span style="color: #0000ff;">require</span> 'Observer_Exception.php'<span style="color: #000000;">;</span><span style="color: #0000ff;">require</span> 'Logging_Exception_Observer.php'<span style="color: #000000;">;</span><span style="color: #0000ff;">require</span> 'Emailing_Exception_Observer.php'<span style="color: #000000;">;Observer_Exception</span>::attach(<span style="color: #0000ff;">new</span><span style="color: #000000;"> Logging_Exception_Observer());</span><span style="color: #0000ff;">class</span> MyException <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Observer_Exception{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> test(){ </span><span style="color: #0000ff;">echo</span> 'this is a test'<span style="color: #000000;">; } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> test1(){ </span><span style="color: #0000ff;">echo</span> "我是自定义的方法处理这个异常"<span style="color: #000000;">; }}</span><span style="color: #0000ff;">try</span><span style="color: #000000;"> { </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> MyException("出现异常,记录一下"<span style="color: #000000;">); } </span><span style="color: #0000ff;">catch</span> (MyException <span style="color: #800080;">$e</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage(); </span><span style="color: #0000ff;">echo</span> "<ht/>"<span style="color: #000000;">; }</span>?>
$_observers は静的変数ではないでしょうか?答えはノーです。 $_observers が静的変数ではない場合、オブザーバーをロードする動作は後続の操作に影響を与えません。 static を使用すると、すべてのインスタンス メンバーが変数を共有できます。クラスの継承も同様に機能します。興味があれば、静電気の魔法の効果を引き続き探索してください。
この例は、出力が一般的な状況と変わらないことを示していますが、異なる点は、対応するログがカスタマイズされたファイルの下に生成されていることです。最終的な関数は単純ですが、多くの人はより少ないコードで簡単な方法で実装することもできます。ただし、より複雑なシステムを実装する場合、オブザーバー パターンは非常に便利です。