摘要:Yii2的事件採用了“觀察者模式”,先了解觀察者,再學事件就容易了。
它是什麼
首先不要被名字所嚇倒,往下看,它真的很簡單。
先來一個比較高大上的定義:觀察者模式定義了一系列物件之間的一對多關係,當一個物件改變狀態後,其他依賴者都會收到通知。
看明白了麼?
如果沒明白我們再來一個生活一點的:觀察者模式就是訂報紙的模式,你和一些人向某個報社訂報紙,只要有新報紙出版,報社就會給你們送來,具體你們怎麼看和報社無關,只要報社不倒閉,就會一直送你們。
當然,你也可以取消訂閱。
觀察者模式== 報社+ 訂報紙的人
#無論你明白了哪種定義,記住一點,「觀察者模式」最屌的地方就是讓一些彼此依賴的類松耦合,牛逼的系統是什麼樣的?那就是每個物件間的依賴程度降到冰點,但依然可以互動。
Code it
我想到此刻,你已經清楚了觀察者模式,但是作為一個語言類文章,不寫點程式碼總說不過去,我們接下來用程式碼來實現上面的需求。
我們先來一個不用觀察者模式的程式碼
class Video { public function new(){ $checkNewVideo = Video::find()->where("xxxxx")->one(); if($checkNewVideo){ // 通知各位 LaoWang::newVideo(); XiaoLi::newVideo(); ChuanPu::newVideo(); ....... // 还有很多很多,比如在给某个集体客户群发、短信发等等等等 } } }// 具体实现$model = new Video(); $model->new();
其實,在系統小的時候,這是非常快速有效的方式。
但是,當系統變大的時候,這種方法馬上面臨難以擴展的問題,並且容易出錯。
例如老王不想訂閱了,我們需要改原始碼。
例如又增加了一個客戶,我們要去改原始碼。
例如xxx,我們都需要改原始碼。
這兩個物件的耦合度太高了。
解決它- 用觀察者模式
我們先改進上面的程式碼
/** * 被观察者接口 * 定义了一些公用方法声明,使用观察者模式的类都可以继承此接口 */interface Observable { // 添加/注册观察者 public function attach(Observer $observer); // 删除观察者 public function detach(Observer $observer); // 触发通知 public function notify(); }class Video implements Observable { public $observers = [];// 订阅者 // 添加观察者 public function attach(Observer $observer){ $key = array_search($observer, $this->observers); if ($key === false) { $this->observers[] = $observer; } } // 删除观察者 public function detach(Observer $observer){ $key = array_search($observer, $this->observers); if ($key !== false) { unset($this->observers[$key]); } } // 通知所有观察者 public function notify(){ foreach ($this->observers as $observer) { // 把本类对象传给观察者 $observer->update($this); } } public function new(){ $checkNewVideo = Video::find()->where("xxxxx")->one(); if($checkNewVideo){ $this->notify(); } } }
你看到了,修改後的程式碼並不關心具體發送給誰,它只是遍歷了所有觀察者的列表,然後告訴他們一下而已,觀察者增減對此類不會有任何影響。
对于观察者,数字不定,随时有增减,因此我们定义了一个观察者接口开始抽象它们。
/** * 观察者接口 */interface Observer{ // 接收到通知的处理方法 public function update(Observable $observable); }
老王、小明、川普、冰冰订阅了视频
class LaoWang implements Observer { public function update(Observable $observable){ echo "立刻开始看视频"; } }class XiaoMing implements Observer { public function update(Observable $observable){ echo "收到后忽略通知"; } }class ChuanPu implements Observer { public function update(Observable $observable){ echo "收藏了一下,然后去wc看"; } }class BingBing implements Observer { public function update(Observable $observable){ echo "立刻开始看视频"; } }
具体实现
$model = new Video(); $model->attach(new LaoWang()); $model->attach(new XiaoLi()); $model->attach(new ChuanPu()); $model->attach(new BingBing()); $model->new();
这样当我们再增加一个人加入 习大大 的时候,我们只需要增加一个习大大的观察者类,在实现的时候添加注册,而不需要去改Video类和其他的观察者类,将类之间的耦合降低了很多。
回头看
上面就是观察者模式,我们先预想一下我们的事件,假设我们定义了很多观察者代码,他们监听事件的发生,当一个事件被触发,这些观察者都会知道,执行各自的逻辑。
事件就是观察者模式的一种应用。
监听系统的某一个行为,实时获取并执行自己负责的代码。
以上是詳解PHP設計模式之觀察者模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

防止會話固定攻擊的有效方法包括:1.在用戶登錄後重新生成會話ID;2.使用安全的會話ID生成算法;3.實施會話超時機制;4.使用HTTPS加密會話數據,這些措施能確保應用在面對會話固定攻擊時堅不可摧。

實現無會話身份驗證可以通過使用JSONWebTokens(JWT)來實現,這是一種基於令牌的認證系統,所有的必要信息都存儲在令牌中,無需服務器端會話存儲。 1)使用JWT生成和驗證令牌,2)確保使用HTTPS防止令牌被截獲,3)在客戶端安全存儲令牌,4)在服務器端驗證令牌以防篡改,5)實現令牌撤銷機制,如使用短期訪問令牌和長期刷新令牌。

PHP會話的安全風險主要包括會話劫持、會話固定、會話預測和會話中毒。 1.會話劫持可以通過使用HTTPS和保護cookie來防範。 2.會話固定可以通過在用戶登錄前重新生成會話ID來避免。 3.會話預測需要確保會話ID的隨機性和不可預測性。 4.會話中毒可以通過對會話數據進行驗證和過濾來預防。

銷毀PHP會話需要先啟動會話,然後清除數據並銷毀會話文件。 1.使用session_start()啟動會話。 2.用session_unset()清除會話數據。 3.最後用session_destroy()銷毀會話文件,確保數據安全和資源釋放。

如何改變PHP的默認會話保存路徑?可以通過以下步驟實現:在PHP腳本中使用session_save_path('/var/www/sessions');session_start();設置會話保存路徑。在php.ini文件中設置session.save_path="/var/www/sessions"來全局改變會話保存路徑。使用Memcached或Redis存儲會話數據,如ini_set('session.save_handler','memcached');ini_set(

tomodifyDataNaphPsession,startTheSessionWithSession_start(),然後使用$ _sessionToset,修改,orremovevariables.1)startThesession.2)setthesession.2)使用$ _session.3)setormodifysessessvariables.3)emovervariableswithunset()

在PHP會話中可以存儲數組。 1.啟動會話,使用session_start()。 2.創建數組並存儲在$_SESSION中。 3.通過$_SESSION檢索數組。 4.優化會話數據以提升性能。

PHP會話垃圾回收通過概率機制觸發,清理過期會話數據。 1)配置文件中設置觸發概率和會話生命週期;2)可使用cron任務優化高負載應用;3)需平衡垃圾回收頻率與性能,避免數據丟失。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

禪工作室 13.0.1
強大的PHP整合開發環境