yii2閱讀隨筆14

繼續來看Event.php

 /*** Triggers a class-level event.* 觸發類級別事件。* This method will cause invocation of event handlers that are attached to the named event* for the specified class and all its parent classes.* 觸發某個類或者對象的某個事件* @param string|object $class the object or the fully qualified class name specifying the class-level event.* @param string $name the event name.* @param Event $event the event parameter. If not set, a default [[Event]] object will be created.*/public static function trigger($class, $name, $event = null){if (empty(self::$_events[$name])) {return;}if ($event === null) {// 事件不存在,就創建一個 Event 對象$event = new static;}// 設置event對象的屬性,默認是未被處理的$event->handled = false;$event->name = $name;if (is_object($class)) {if ($event->sender === null) {// 如果 $class 是個對象,并且是 sender 為空,就將 $class 賦給 sender,即 $class 就是觸發事件的對象$event->sender = $class;}$class = get_class($class);} else {$class = ltrim($class, '\\');}// 循環類的 $_event,直到遇到 $event->handled 為真或者沒有父類了為止do {if (!empty(self::$_events[$name][$class])) {foreach (self::$_events[$name][$class] as $handler) {// 將參數賦到 event 對象的 data 屬性上$event->data = $handler[1];// 調用 $handler 方法// 在方法中,可以用 $this->data 取到相應的參數// 也可以在其中設置 $this->handled 的值,中斷后續事件的觸發call_user_func($handler[0], $event);// 當某個 handled 被設置為 true 時,執行到這個事件的時候,會停止,并忽略剩下的事件if ($event->handled) {return;}}}} while (($class = get_parent_class($class)) !== false);}
}Component.php少分析了幾個方法,現在添加上去!/*** Detaches an existing event handler from this component.* 在該組件中,將現有的事件處理,* This method is the opposite of [[on()]].* 這種方法與on[]方法相反。* @param string $name event name* @param callable $handler the event handler to be removed.* If it is null, all handlers attached to the named event will be removed.* @return boolean if a handler is found and detached* @see on()*/public function off($name, $handler = null){// 保證 behaviors 都加載進來了$this->ensureBehaviors();// 相應的事件不存在,就返回falseif (empty($this->_events[$name])) {return false;}// 沒有handler,就意味著要全部去掉if ($handler === null) {unset($this->_events[$name]);return true;} else {$removed = false;//如果$handler不為空。foreach ($this->_events[$name] as $i => $event) {// $event[0]是handler,$event[1]是數據if ($event[0] === $handler) {unset($this->_events[$name][$i]);$removed = true;}}if ($removed) {// 如果有移出事件的handler,就需要重新構建以下索引,否則會出現index為1,3,4的情況$this->_events[$name] = array_values($this->_events[$name]);}return $removed;}}/*** Triggers an event.* 觸發一個事件。* This method represents the happening of an event. It invokes* all attached handlers for the event including class-level handlers.* 這種方法代表事件的發生。它調用的事件包括類級別的處理程序所包含的所有附加處理程序。* @param string $name the event name* @param Event $event the event parameter. If not set, a default [[Event]] object will be created.*/public function trigger($name, Event $event = null){// 保證 behaviors 都加載進來了$this->ensureBehaviors();if (!empty($this->_events[$name])) {// 構建Event對象,為傳入到handler函數中做準備if ($event === null) {$event = new Event;}if ($event->sender === null) { //如果$event->sender值為null的話,把$this賦值給它。$event->sender = $this;}$event->handled = false; //使handled值為空$event->name = $name;foreach ($this->_events[$name] as $handler) {// 給event的data屬性賦值$event->data = $handler[1];// handler的函數中傳入了一個Event對象call_user_func($handler[0], $event);// stop further handling if the event is handled// 事件是否被handle,當handled被設置為true時,執行到這個event的時候,會停止,并忽略剩下的eventif ($event->handled) {return;}}}// invoke class-level attached handlers// 觸發class級別的handlerEvent::trigger($this, $name, $event);}

?

轉載于:https://www.cnblogs.com/taokai/p/5427660.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374787.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

P1059 [NOIP2006 普及組] 明明的隨機數

題目描述 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤100),對于其中重復的數字,只保留一個,把其余相同的數去掉,不同的數對應著不同的學…

基本的EJB參考,注入和查找

在本系列的第一部分中 ,我們介紹了Enterprise JavaBeans v。3.0規范提供的機制,用于定義EJB組件,聲明對EJB的引用并通過依賴項注入或程序化JNDI查找將它們連接起來。 在此博客文章中,我們將研究一些基本示例以了解如何使用EJB API…

ViewPager使用筆記

1.ViewPager.setCurrentItem(position),即使已設置動畫,但是沒有動畫效果 原因:因為ViewPager滑動之前的時間間隔太短,可以通過反射,去修改ViewPager自動滑動時間,代碼實現如下 1 public class ViewPagerSc…

IOS開發之Swift學習筆記

1.因為存儲屬性要求初始化,我們可以使用lazy修飾符來延遲初始化。轉載于:https://www.cnblogs.com/luntai/p/5430223.html

力扣1兩數之和

給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。 你可以按任意順序返回…

C ++或Java,高頻交易哪個更快?

總覽 關于什么是高頻交易的最佳解決方案,存在不同意見。 問題的一部分是高頻交易的變化超出您的預期,另一部分是更快的含義。 我的看法 如果您有一個典型的Java程序員和一個典型的C 程序員,并且每個人都有幾年編寫典型的面向對象程序的經驗…

iOS 8 Xcode6 設置Launch Image 啟動圖片

本人apem http://www.mamicode.com/info-detail-494411.html 如何設置App的啟動圖,也就是Launch Image? Step1 1.點擊Image.xcassets 進入圖片管理,然后右擊,彈出"New Launch Image"2.如圖,右側的勾選可以讓你選擇是否要對ipad,橫屏,豎屏,以及低版本的ios系統做支持…

代碼分享h5-sessionStorage,提示app下載代碼塊

1.html <div class"down-app">    <span id"dowm-close">x</span>    <dl>      <dt>logo</dt>      <dd>        <h3>某某公司</h3>        <p>某某公…

Apache CXF負載平衡和故障轉移

前一段時間&#xff0c;我們已經面臨基于Apache CXF的負載平衡Web服務客戶端的需求。 此外&#xff0c;當某些服務器關閉時&#xff0c;客戶端應自動進行故障轉移。 更糟糕的是&#xff0c;服務器目標地址列表要從外部服務獲取并在運行時更新。 最終&#xff0c;我們最終獲得了…

Java局部變量一定要賦初值

根據大佬文章https://blog.csdn.net/wjw521wjw521/article/details/79243596的理解而寫的 1.類成員變量在 類加載 時會被系統賦初值&#xff0c;比如定義一個整型變量int num 系統默認num值為0 2.但是方法內的局部變量執行進棧操作&#xff0c;這個過程中系統不會賦初值&…

隱式的類類型轉換

如果構造函數只接受一個實參&#xff0c;則它實際上定義了轉換為此類類型的隱式轉換機制。將這種構造函數稱為轉換構造函數。 #ifndef MAIN_H_INCLUDED#define MAIN_H_INCLUDED#include<iostream>usingnamespace std;classClassTest{public:ClassTest(){ cout <<&q…

負數的 %求余和取模

1.求余和取模是不同的 2.‘%’ 在C/C&#xff0c;Java等語言中意為 求余 &#xff0c;在python 中意為 取模 3.a%b c 求余: c的符號和a一致 取模&#xff1a;c的符號和b一致 比如&#xff0c;一個小李子&#xff1a; public class Solution{public static void main(String…

PAT-BASIC-1038-統計同成績學生

本題要求讀入N名學生的成績&#xff0c;將獲得某一給定分數的學生人數輸出。 輸入格式&#xff1a; 輸入在第1行給出不超過105的正整數N&#xff0c;即學生總人數。隨后1行給出N名學生的百分制整數成績&#xff0c;中間以空格分隔。最后1行給出要查詢的分數個數K&#xff08;不…

JavaScript事件處理的三種方式(轉)

一、什么是JavaScript事件&#xff1f;事件(Event)是JavaScript應用跳動的心臟&#xff0c;也是把所有東西粘在一起的膠水&#xff0c;當我們與瀏覽器中Web頁面進行某些類型的交互時&#xff0c;事件就發生了。 事件可能是用戶在某些內容上的點擊、鼠標經過某個特定元素或按下鍵…

Erlang與Java內存架構

我讀了一篇關于Erlang VM的內存管理策略的非常非常有趣的文章。 它是Jesper Wilhelmsson撰寫的論文 &#xff0c;我認為討論Erlang的內存設置和Oracle的Java VM之間的差異可能會很好。 作為對從未聽說過Erlang的人的真正的簡短介紹; 它是一種功能語言&#xff0c;使用異步消息傳…

Xuggler教程:轉碼和媒體修改

注意&#xff1a;這是我們的“ Xuggler開發教程 ”系列的一部分。 在之前的教程中&#xff0c;我對視頻處理Xuggler進行了簡短介紹 。 在這一部分中&#xff0c;我們將看到Xuggler和FFmpeg提供的一些更令人興奮的功能&#xff0c;例如視頻轉碼和媒體修改。 不要忘記Xuggler是一…

Web工程師必備的43款可視化工具

國外站點DATAVISUALIZATION.CH為大家總結出了當前熱用的43款可視化工具&#xff0c;包括Arbor、Chroma.js、D3.js、Google Chart Tools等&#xff0c;絕對讓你一飽眼福。 1.Arbor.js Arbor是一個免費的、可視化的圖形庫&#xff0c;基于矢量創建動態的連接圖。它為圖形組織和屏…

力扣7. 整數反轉

方法一&#xff1a;官方給的&#xff0c;自己懂了后照著敲了一遍 class Solution {public int reverse(int x) {int rev 0;while (x ! 0) {//if判斷條件過于復雜&#xff0c;我好不容易看懂了if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {retu…

AndroidManifest.xml中的application中的name屬性

被這個不起眼的屬性折磨了一天&#xff0c;終于解決了。 由于項目需要&#xff0c;要合并兩個android應用&#xff0c;于是拷代碼&#xff0c;拷布局文件&#xff0c;拷values&#xff0c;所有的都搞定之后程序還是頻頻崩潰&#xff0c;一直沒有找到原因&#xff0c;學android…

完美單身

我不時遇到一些Java程序員&#xff0c;他們不確定他們應該如何正確實現Singleton模式。 &#xff08;如果您不知道什么是Singleton&#xff0c;請嘗試Wikipedia&#xff1a; Singleton模式 &#xff09;。 我并不是在談論在線程環境中的正確實現。 但是&#xff0c;使用最常見的…