溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在PHP中利用觀察者模式處理異常信息

發(fā)布時(shí)間:2021-05-17 16:59:54 來(lái)源:億速云 閱讀:142 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)如何在PHP中利用觀察者模式處理異常信息,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

異常信息的捕獲對(duì)編程測(cè)試有著重要的意義,這里結(jié)合觀察者模式,探索如何處理異常信息。

關(guān)于觀察者模式,如果還沒(méi)有接觸過(guò)的話,博客園有很多優(yōu)秀的博友做了詳細(xì)的 解釋。筆者覺(jué)得,所謂觀察者模式,必須有兩個(gè)重要組成部分:一個(gè)主題對(duì)象,多個(gè)觀察者。在使用的時(shí)候,我們可以將觀察者像插頭一樣插到主題對(duì)象這個(gè)插座上,利用主題對(duì)象完成相應(yīng)功能。

既然觀察者要作為插頭,必須要有一個(gè)統(tǒng)一的口徑才能插到相同的插座上,因而先定義一個(gè)接口,Exception_Observer.php:

<?php
/**
 * 定義的規(guī)范
 */
interface Exception_Observer{
  public function update(Observer_Exception $e);
}
?>

相對(duì)于眾多觀察者,我們首先應(yīng)該關(guān)注唯一的主題對(duì)象,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);
    }
  }
}

我們可以清楚地看到,靜態(tài)變量$_observers用來(lái)放置插入的觀察者,notify()用來(lái)通知所有觀察者對(duì)象。

這里需要注意 $observer->update($this); 里面 $this 的用法,很多初學(xué)者會(huì)感到“原來(lái) $this 也可以這么用啊”。

一個(gè)小問(wèn)題: $_observers 不是靜態(tài)變量可不可以? 這個(gè)問(wèn)題我們后面回答。

定義兩個(gè)觀察者,原則上實(shí)現(xiàn)接口所定義的功能。

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="時(shí)間".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.="行號(hào)".$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="時(shí)間".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.="行號(hào)".$e->getLine().PHP_EOL;
    error_log($message,3,$this->_filename);
  }
}

設(shè)計(jì)完所有該有的主體對(duì)象和插件,我們做個(gè)小小的測(cè)試:

<?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 "我是自定義的方法處理這個(gè)異常";
  }
}
try {
  throw new MyException("出現(xiàn)異常,記錄一下");
} catch (MyException $e) {
  echo $e->getMessage();
  echo "<ht/>";
}
?>

php有什么用

php是一個(gè)嵌套的縮寫(xiě)名稱,是英文超級(jí)文本預(yù)處理語(yǔ)言,它的語(yǔ)法混合了C、Java、Perl以及php自創(chuàng)新的語(yǔ)法,主要用來(lái)做網(wǎng)站開(kāi)發(fā),許多小型網(wǎng)站都用php開(kāi)發(fā),因?yàn)閜hp是開(kāi)源的,從而使得php經(jīng)久不衰。

關(guān)于如何在PHP中利用觀察者模式處理異常信息就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI