亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP的Yii框架中行為的定義與綁定方法講解

2024-05-04 23:44:05
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP的Yii框架中行為的定義與綁定方法,包括對靜態方法綁定行為與動態方法綁定行為的講解,需要的朋友可以參考下
 

定義行為

要定義行為,通過繼承 yii/base/Behavior 或其子類來建立一個類。如:

namespace app/components;use yii/base/Behavior;class MyBehavior extends Behavior{  public $prop1;  private $_prop2;  public function getProp2()  {    return $this->_prop2;  }  public function setProp2($value)  {    $this->_prop2 = $value;  }  public function foo()  {    // ...  }}

以上代碼定義了行為類 app/components/MyBehavior 并為要附加行為的組件提供了兩個屬性 prop1 、 prop2 和一個方法 foo()。注意屬性 prop2 是通過 getter getProp2() 和 setter setProp2() 定義的。能這樣用是因為 yii/base/Object 是 yii/base/Behavior 的祖先類,此祖先類支持用 getter 和 setter 方法定義屬性

提示:在行為內部可以通過 yii/base/Behavior::owner 屬性訪問行為已附加的組件。

靜態方法綁定行為

靜態綁定行為,只需要重載 yii/base/Component::behaviors() 就可以了。 這個方法用于描述類所具有的行為。如何描述呢? 使用配置來描述,可以是Behavior類名,也可以是Behavior類的配置數組:

namespace app/models;use yii/db/ActiveRecord;use app/Components/MyBehavior;class User extends ActiveRecord{  public function behaviors()  {    return [      // 匿名的行為,僅直接給出行為的類名稱      MyBehavior::className(),      // 名為myBehavior2的行為,也是僅給出行為的類名稱      'myBehavior2' => MyBehavior::className(),      // 匿名行為,給出了MyBehavior類的配置數組      [        'class' => MyBehavior::className(),        'prop1' => 'value1',        'prop3' => 'value3',      ],      // 名為myBehavior4的行為,也是給出了MyBehavior類的配置數組      'myBehavior4' => [        'class' => MyBehavior::className(),        'prop1' => 'value1',        'prop3' => 'value3',      ]    ];  }}

還有一個靜態的綁定辦法,就是通過配置文件來綁定:

[  'as myBehavior2' => MyBehavior::className(),  'as myBehavior3' => [    'class' => MyBehavior::className(),    'prop1' => 'value1',    'prop3' => 'value3',  ],]

動態方法綁定行為

動態綁定行為,需要調用 yii/base/Compoent::attachBehaviors():

$Component->attachBehaviors([  'myBehavior1' => new MyBehavior, // 這是一個命名行為  MyBehavior::className(),     // 這是一個匿名行為]);

這個方法接受一個數組參數,參數的含義與上面靜態綁定行為是一樣一樣的。

在上面的這些例子中,以數組的鍵作為行為的命名,而對于沒有提供鍵名的行為,就是匿名行為。

對于命名的行為,可以調用 yii/base/Component::getBehavior() 來取得這個綁定好的行為:

$behavior = $Component->getBehavior('myBehavior2');

對于匿名的行為,則沒有辦法直接引用了。但是,可以獲取所有的綁定好的行為:

$behaviors = $Component->getBehaviors();

綁定的內部原理

只是重載一個 yii/base/Component::behaviors() 就可以這么神奇地使用行為了? 這只是冰山的一角,實際上關系到綁定的過程,有關的方面有:

yii/base/Component::behaviors()yii/base/Component::ensureBehaviors()yii/base/Component::attachBehaviorInternal()yii/base/Behavior::attach()

4個方法中,Behavior只占其一,更多的代碼,是在Component中完成的。

yii/base/Component::behaviors() 上面講靜態方法綁定行為時已經提到了,就是返回一個數組用于描述行為。 那么 yii/base/Component::ensuerBehaviors() 呢?

這個方法會在Component的諸多地方調用 __get() __set() __isset() __unset() __call() canGetProperty() hasMethod() hasEventHandlers() on() off() 等用到,看到這么多是不是頭疼?一點都不復雜,一句話,只要涉及到類的屬性、方法、事件這個函數都會被調用到。

這么眾星拱月,被諸多凡人所需要的 ensureBehaviors() 究竟是何許人也? 就像名字所表明的,他的作用在于“ensure” 。其實只是確保 behaviors() 中所描述的行為已經進行了綁定而已:

public function ensureBehaviors(){  // 為null表示尚未綁定  // 多說一句,為空數組表示沒有綁定任何行為  if ($this->_behaviors === null) {    $this->_behaviors = [];    // 遍歷 $this->behaviors() 返回的數組,并綁定    foreach ($this->behaviors() as $name => $behavior) {      $this->attachBehaviorInternal($name, $behavior);    }  }}

這個方法主要是對子類用的, yii/base/Compoent 沒有任何預先注入的行為,所以,這個調用沒有用。 但是對于子類,你可能重載了 yii/base/Compoent::behaviros() 來預先注入一些行為。 那么,這個函數會將這些行為先注入進來。

從上面的代碼中,自然就看到了接下來要說的第三個東東, yii/base/Component/attachBehaviorInternal():

private function attachBehaviorInternal($name, $behavior){  // 不是 Behavior 實例,說是只是類名、配置數組,那么就創建出來吧  if (!($behavior instanceof Behavior)) {    $behavior = Yii::createObject($behavior);  }  // 匿名行為  if (is_int($name)) {    $behavior->attach($this);    $this->_behaviors[] = $behavior;  // 命名行為  } else {    // 已經有一個同名的行為,要先解除,再將新的行為綁定上去。    if (isset($this->_behaviors[$name])) {      $this->_behaviors[$name]->detach();    }    $behavior->attach($this);    $this->_behaviors[$name] = $behavior;  }  return $behavior;}

首先要注意到,這是一個private成員。其實在Yii中,所有后綴為 *Internal 的方法,都是私有的。 這個方法干了這么幾件事:

如果 $behavior 參數并非是一個 Behavior 實例,就以之為參數,用 Yii::createObject() 創建出來。
如果以匿名行為的形式綁定行為,那么直接將行為附加在這個類上。
如果是命名行為,先看看是否有同名的行為已經綁定在這個類上,如果有,用后來的行為取代之前的行為。
在 yii/base/Component::attachBehaviorInternal() 中, 以 $this 為參數調用了 yii/base/Behavior::attach() 。 從而,引出了跟綁定相關的最后一個家伙 yii/base/Behavior::attach() , 這也是前面我們講行為的要素時沒講完的。先看看代碼:

public function attach($owner){  $this->owner = $owner;  foreach ($this->events() as $event => $handler) {    $owner->on($event, is_string($handler) ? [$this, $handler] :      $handler);  }}

上面的代碼干了兩件事:

  • 設置好行為的 $owner ,使得行為可以訪問、操作所依附的對象
  • 遍歷行為中的 events() 返回的數組,將準備響應的事件,通過所依附類的 on() 綁定到類上

總結

說了這么多,關于綁定,做個小結:

  • 綁定的動作從Component發起;
  • 靜態綁定通過重載 yii/base/Componet::behaviors() 實現;
  • 動態綁定通過調用 yii/base/Component::attachBehaviors() 實現;
  • 行為還可以通過為 Component 配置 as 配置項進行綁定;
  • 行為有匿名行為和命名行為之分,區別在于綁定時是否給出命名。 命名行為可以通過其命名進行標識,從而有針對性地進行解除等操作;
  • 綁定過程中,后綁定的行為會取代已經綁定的同名行為;
  • 綁定的意義有兩點,一是為行為設置 $owner 。二是將行為中擬響應的事件的handler綁定到類中去。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久av| 欧洲永久精品大片ww免费漫画| 亚洲mm色国产网站| 亚洲日本成人网| 性夜试看影院91社区| 成人在线视频福利| www.国产精品一二区| 久久躁狠狠躁夜夜爽| 国产在线高清精品| 日韩av成人在线观看| 中国日韩欧美久久久久久久久| 亚洲国产美女精品久久久久∴| 中文字幕日韩av综合精品| 日韩男女性生活视频| 黑人巨大精品欧美一区二区三区| 国产一区二区av| 中文字幕欧美精品日韩中文字幕| 美女视频黄免费的亚洲男人天堂| 国产成人a亚洲精品| 3344国产精品免费看| 亚洲男人天堂2023| 日韩av在线电影网| 亚洲欧洲日产国码av系列天堂| 亚洲激情免费观看| 亚洲国产精品电影在线观看| 日韩欧美在线视频观看| 国产成人精品午夜| 亚洲风情亚aⅴ在线发布| 欧美日韩精品中文字幕| 尤物九九久久国产精品的分类| 欧美大片网站在线观看| 精品日韩视频在线观看| 欧美午夜久久久| 欧美日韩国产麻豆| 欧美成人在线影院| 国产精品一区二区三区成人| 日本亚洲欧洲色| 日韩美女视频在线观看| 亚洲欧美激情另类校园| 成人黄色免费看| 久久久久久高潮国产精品视| 欧美日韩成人免费| 欧美亚洲国产成人精品| 国产+成+人+亚洲欧洲| 精品久久久久久久久国产字幕| 日韩精品免费视频| 91成人在线播放| xxxx欧美18另类的高清| 国产精品美女www爽爽爽视频| 95av在线视频| 国产日韩在线播放| 热99精品只有里视频精品| 欧美乱大交做爰xxxⅹ性3| 国产精品爱啪在线线免费观看| 91精品国产电影| 91豆花精品一区| 欧美国产日韩中文字幕在线| 88国产精品欧美一区二区三区| 久久中文字幕在线视频| 4444欧美成人kkkk| 久久久国产影院| 亚洲色图美腿丝袜| 欧美第一淫aaasss性| 国产精品av网站| 欧美日韩一区二区在线| 亚洲欧美制服第一页| 国产成人精品免费久久久久| 永久免费毛片在线播放不卡| 国模极品一区二区三区| 欧美精品videofree1080p| www.欧美精品一二三区| 亚洲理论片在线观看| 精品国产鲁一鲁一区二区张丽| 在线激情影院一区| 91精品国产电影| 亚洲伊人一本大道中文字幕| 色婷婷综合久久久久中文字幕1| 国产精品久久久久久亚洲调教| 欧美视频在线观看 亚洲欧| 26uuu亚洲国产精品| 色www亚洲国产张柏芝| 少妇激情综合网| 欧美日韩爱爱视频| 国产精品第三页| 精品国产91久久久| 中文字幕日本精品| 亚洲午夜女主播在线直播| 欧美日韩在线视频一区二区| 91国语精品自产拍在线观看性色| 性欧美办公室18xxxxhd| 亚洲国产精品悠悠久久琪琪| 亚洲香蕉伊综合在人在线视看| 欧美成aaa人片在线观看蜜臀| 久久精品国产清自在天天线| 欧美电影第一页| 精品国内产的精品视频在线观看| 欧美日韩福利在线观看| 久久电影一区二区| 久久精品91久久香蕉加勒比| 亚洲成人三级在线| 在线看福利67194| 国产99视频在线观看| www国产精品com| 亚洲永久免费观看| 久久久女人电视剧免费播放下载| 欧美亚洲免费电影| 少妇高潮久久久久久潘金莲| 午夜精品久久久久久久久久久久| 九九热最新视频//这里只有精品| 国产视频999| 精品久久久久久中文字幕一区奶水| 欧美影院成年免费版| 欧美日韩亚洲一区二区| 国产精品一区二区三| 国语自产精品视频在线看抢先版图片| 91po在线观看91精品国产性色| 日韩欧美精品免费在线| 亚洲男人天堂网站| 亚洲一区二区黄| 日韩av免费在线看| 91精品久久久久久久久久入口| 激情亚洲一区二区三区四区| 91po在线观看91精品国产性色| 久久久噜噜噜久久久| 色一情一乱一区二区| 日韩美女写真福利在线观看| 亚洲成av人片在线观看香蕉| 国产精品jizz在线观看麻豆| 91精品久久久久久久久中文字幕| 亚洲性日韩精品一区二区| 国产精品亚洲美女av网站| 在线精品国产成人综合| 96国产粉嫩美女| 在线观看日韩www视频免费| 日韩精品在线免费播放| 日韩欧美在线视频观看| 久热精品视频在线免费观看| 国产精品久久久久免费a∨大胸| 欧美大尺度电影在线观看| 国产最新精品视频| 91免费人成网站在线观看18| 国产又爽又黄的激情精品视频| 亚洲永久免费观看| 蜜臀久久99精品久久久久久宅男| 欧美亚洲第一页| 日韩电影视频免费| 久久香蕉国产线看观看av| 国产精品成av人在线视午夜片| 亚洲乱码一区二区| 国产精品三级在线| 成人激情电影一区二区| 亚洲国产精品久久精品怡红院| 91精品久久久久久久久青青| 91精品免费久久久久久久久| 日韩福利视频在线观看| 亚洲网址你懂得| 亚洲美女激情视频| 欧美大全免费观看电视剧大泉洋| 亚洲精品aⅴ中文字幕乱码| 久久久视频精品| 91在线直播亚洲| 日韩av三级在线观看| 中文字幕精品一区久久久久| 亚洲91精品在线|