<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # [SplSubject interface](https://www.php.net/manual/zh/class.splsubject.php#class.splsubject) >[info] SplSubject接口與SplObserver一起用于實現Observer觀察者設計模式 > 被觀察者,?負責維護觀察者并在變化發生是通知觀察者 ## **方法:** ``` SplSubject { /* 方法 */ abstract public attach ( SplObserver $observer ) : void //附加SplObserver觀察者 abstract public detach ( SplObserver $observer ) : void //分離SplObserver觀察者 abstract public notify ( void ) : void //通知SplObserver觀察者 } ``` ## **方法:**例子: ``` //觀察者類 class Observer implements SplObserver{ public function update(SplSubject $subject){ //發郵件、發通知、寫日志等邏輯寫在這里 } } //被觀察者, 負責監聽需要觸發事件的類 維護觀察者并在變化發生是通知觀察者 class Subject implements SplSubject{ //附加SplObserver觀察者 public function attach ( SplObserver $observer ){ //一般用對象存儲的方式存儲傳過來的觀察者類 } //分離SplObserver觀察者 public function detach ( SplObserver $observer ){ } //通知SplObserver觀察者 public function notify (){ //一般遍歷對象存儲的方式來逐個通知觀察者 } } //實例化觀察者類 $observer= new Observer(); //被觀察者類 監聽 $Subject=new Subject('需要監聽的類對象'); //添加觀察者 $Subject->attach($observer); //移除觀察者 $Subject->detach($observer); //通知觀察者 $Subject->notify(); ``` ``` /** * * 觀察者模式 Observer * */ function output($string) { echo $string . "n"; } //訂單數據對象簡單模擬,這個是實際需要被觀察的對象(Subject),但是我們將其獨立,然后 //通過構造方法傳入到我們模式中的Subject中,這樣使具體業務更加獨立 class Order{ //訂單號 private $id = ''; //用戶ID private $userId = ''; //用戶名 private $userName = ''; //價格 private $price = ''; //下單時間 private $orderTime = ''; //訂單數據填充簡單模擬,實際應用中可能會讀取用戶表單輸入并處理 public function __set($name, $value){ if (isset($this->$name)){ $this->$name = $value; } } //獲取訂單屬性 public function __get($name){ if (isset($this->$name)){ return $this->$name; } return ""; } } //被觀察者, 負責監聽類、維護觀察者并在變化發生是通知觀察者 class OrderSubject implements SplSubject { private $observers; private $order; public function __construct(Order $order) { $this->observers = new SplObjectStorage(); $this->order = $order; } //增加一個觀察者 public function attach(SplObserver $observer) { $this->observers->attach($observer); } //移除一個觀察者 public function detach(SplObserver $observer) { $this->observers->detach($observer); } //通知所有觀察者 public function notify() { foreach ($this->observers as $observer) { $observer->update($this); } } //返回主體對象的具體實現,供觀察者調用 public function getOrder() { return $this->order; } } //觀察者(事件類) 記錄業務數據日志 (ActionLogObserver),實際可能還要抽象一層以處理不同的Action(業務操作),這里省略 class ActionLogObserver implements SplObserver{ public function update(SplSubject $subject) { $order = $subject->getOrder(); //實際應用可能會寫到日志文件中,這里直接輸出 output( "[OrderId:{$order->id}] [UseId:{$order->userId}] [Price:{$order->price}]" ); } } //觀察者(事件類) 給用戶發送訂單確認郵件 (UserMailObserver) class UserMailObserver implements SplObserver{ public function update(SplSubject $subject) { $order = $subject->getOrder(); //實際應用會調用郵件發送服務如sendmail,這里直接輸出 output( "Dear {$order->userName}: Your order {$order->id} was confirmed!" ); } } //觀察者(事件類) 給管理人員發訂單處理通知郵件 (AdminMailObserver) class AdminMailObserver implements SplObserver{ public function update(SplSubject $subject) { $order = $subject->getOrder(); //實際應用會調用郵件發送服務如sendmail,這里直接輸出 output( "Dear Manager: User {$order->userName}(ID:{$order->userId}) submitted a new order {$order->id}, please handle it ASAP!" ); } } //假設的DB類,便于測試,實際會存入真實數據庫 class FakeDB{ public function save($data){ return true; } } Client::test(); //客戶端調用 注意 class Client { public static function test() { //初始化一個訂單數據 $order = new Order(); $order->id = 1001; $order->userId = 9527; $order->userName = "God"; $order->price = 20.0; $order->orderTime = time(); //監聽order類 $subject = new OrderSubject($order); //監聽其他類 //$subject2 = new OrderSubject($else); $actionLogObserver = new ActionLogObserver(); $userMailObserver = new UserMailObserver(); $adminMailObserver = new AdminMailObserver(); //增加一個觀察者 $subject->attach($actionLogObserver); $subject->attach($userMailObserver); $subject->attach($adminMailObserver); //向數據庫保存訂單 $db = new FakeDB(); $result = $db->save($order); if ($result){ //保存訂單成功通知觀察者 $subject->notify(); } } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看