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

首頁 > 開發(fā) > PHP > 正文

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

2024-05-04 23:44:05
字體:
供稿:網(wǎng)友
這篇文章主要介紹了PHP的Yii框架中行為的定義與綁定方法,包括對(duì)靜態(tài)方法綁定行為與動(dòng)態(tài)方法綁定行為的講解,需要的朋友可以參考下
 

定義行為

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

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 并為要附加行為的組件提供了兩個(gè)屬性 prop1 、 prop2 和一個(gè)方法 foo()。注意屬性 prop2 是通過 getter getProp2() 和 setter setProp2() 定義的。能這樣用是因?yàn)?yii/base/Object 是 yii/base/Behavior 的祖先類,此祖先類支持用 getter 和 setter 方法定義屬性

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

靜態(tài)方法綁定行為

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

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類的配置數(shù)組      [        'class' => MyBehavior::className(),        'prop1' => 'value1',        'prop3' => 'value3',      ],      // 名為myBehavior4的行為,也是給出了MyBehavior類的配置數(shù)組      'myBehavior4' => [        'class' => MyBehavior::className(),        'prop1' => 'value1',        'prop3' => 'value3',      ]    ];  }}

還有一個(gè)靜態(tài)的綁定辦法,就是通過配置文件來綁定:

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

動(dòng)態(tài)方法綁定行為

動(dòng)態(tài)綁定行為,需要調(diào)用 yii/base/Compoent::attachBehaviors():

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

這個(gè)方法接受一個(gè)數(shù)組參數(shù),參數(shù)的含義與上面靜態(tài)綁定行為是一樣一樣的。

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

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

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

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

$behaviors = $Component->getBehaviors();

綁定的內(nèi)部原理

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

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

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

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

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

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

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

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

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

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

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

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

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

上面的代碼干了兩件事:

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

總結(jié)

說了這么多,關(guān)于綁定,做個(gè)小結(jié):

  • 綁定的動(dòng)作從Component發(fā)起;
  • 靜態(tài)綁定通過重載 yii/base/Componet::behaviors() 實(shí)現(xiàn);
  • 動(dòng)態(tài)綁定通過調(diào)用 yii/base/Component::attachBehaviors() 實(shí)現(xiàn);
  • 行為還可以通過為 Component 配置 as 配置項(xiàng)進(jìn)行綁定;
  • 行為有匿名行為和命名行為之分,區(qū)別在于綁定時(shí)是否給出命名。 命名行為可以通過其命名進(jìn)行標(biāo)識(shí),從而有針對(duì)性地進(jìn)行解除等操作;
  • 綁定過程中,后綁定的行為會(huì)取代已經(jīng)綁定的同名行為;
  • 綁定的意義有兩點(diǎn),一是為行為設(shè)置 $owner 。二是將行為中擬響應(yīng)的事件的handler綁定到類中去。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美成人bangbros| 日韩成人久久久| 亚洲精品人人| 亚洲欧洲精品成人久久奇米网| 欧美午夜在线| 黄在线观看在线播放720p| 亚洲人成电影网站| 男女无套免费视频网站动漫| 日韩av影视大全| 成在在线免费视频| 国产调教在线| 日韩av中文字幕一区| 久久人妻免费视频| 亚洲国产精品久久久久| 免费国产a级片| 欧美大片在线看免费观看| 日韩欧美成人一区二区三区| 成人久久视频在线观看| 三级在线免费看| 欧美日韩国产免费观看| 668精品在线视频| www国产91| 在线一区av| 3d欧美精品动漫xxxx无尽| 韩国主播福利视频一区二区三区| 欧洲精品国产| 国内精品久久久久久久97牛牛| 日韩黄色影院| 国产精品中出一区二区三区| 亚洲午夜国产成人av电影男同| 精品一区二区三区欧美| 欧美午夜电影一区二区三区| 欧美一二三四在线| 精品一二三四在线| 国产成人免费91av在线| 在线91免费看| 四虎永久免费影院| www.日本三级| 亚洲成av人在线观看| 色在线视频免费| 伊人av在线com| 日韩国产精品91| 成人做爰免费视频免费看| 欧美性高跟鞋xxxxhd| 国产人成高清视频观看| 在线免费看污| 久久久久中文字幕2018| 伊人色综合久久天天五月婷| 热国产热中文视频二区| 欧美巨大xxxx| 欧美欧美黄在线二区| gogo高清在线播放免费| 欧美一区二区少妇| 久久久久亚洲av无码a片| 欧美午夜理伦三级在线观看| 国产欧美视频一区二区三区| 欧美做爰性欧美大fennong| 加勒比免费视频| 2021国产视频| 国产一级片网址| 成人av蜜桃| 天天操天天舔天天射| 欧美激情奇米色| 欧美乱做爰xxxⅹ久久久| 八戒八戒神马在线电影| 五月天国产精品| 中国人体摄影一区二区三区| 91超碰caoporn97人人| 国产宾馆自拍| 亚洲91av视频| 日本韩国欧美超级黄在线观看| 337p日本欧洲亚洲大胆张筱雨| 国产欧美日韩不卡免费| 成熟丰满熟妇高潮xxxxx视频| 先锋影音av在线资源| 超碰97av在线| 无码人妻一区二区三区免费| 中国一区二区三区| 欧美日韩国产精品专区| 97人人澡人人爽| 国产成人午夜片在线观看高清观看| 欧美一二三区在线| 丰满少妇高潮在线观看| 免费观看30秒视频久久| 欧美日韩成人在线一区| 中国毛片在线观看| 91精品秘密在线观看| 日韩欧美aaaaaa| 亚洲精品aⅴ| 欧美久久婷婷综合色| 青青草免费观看免费视频在线| 一级黄色免费网站| av大全在线免费看| 影视亚洲一区二区三区| 色偷偷偷综合中文字幕;dd| 精品处破女学生| 精品av久久707| aaa在线免费观看| caoporn国产精品| 激情伊人五月天久久综合| 欧美国产日韩一区二区| 丰满人妻一区二区三区免费| 天天综合天天添夜夜添狠狠添| 超碰网在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 九九九在线观看视频| 久久久亚洲成人| 高清在线一区| 欧美在线观看视频一区二区三区| 欧美三级在线视频| 美女在线一区| 精品一区二区视频| 粉嫩精品一区二区三区在线观看| 好好的日comwww| 视频一区二区三区在线观看| 亚洲视频在线一区观看| 成人精品一区二区三区中文字幕| 特大巨黑人吊性xxx视频| 麻豆影视在线| 国产精品人人爽| 黄色三级视屏| 色婷婷综合视频| 美女日批在线观看| 国产亚洲aⅴaaaaaa毛片| 成人ar影院免费观看视频| 91丝袜超薄交口足| 91超薄丝袜肉丝一区二区| 精品欧美一区二区久久| 99热这里都是精品| 久久精品国产999大香线蕉| 99视频在线精品国自产拍免费观看| 久久久久久亚洲精品不卡4k岛国| 蜜桃免费在线视频| 久久97精品| 成人三级视频在线播放| 在线观看日韩精品| 99这里只有久久精品视频| 亚洲一二三专区| 亚洲 小说 欧美 激情 另类| 国产精品18p| 亚洲风情在线资源站| 亚洲免费网站在线观看| 成人免费观看在线观看| 91嫩草免费看| 91免费看片在线观看| av高清久久久| 伊人伊人伊人久久| 欧美在线看片a免费观看| 最新中文字幕在线播放| 黑人久久a级毛片免费观看| 一本色道久久综合狠狠躁的番外| 97av中文字幕| 波多野结衣一区二区三区四区| 中文字幕av在线| 精品999日本久久久影院| 欧美x0x0| 高清av不卡| 美国十次了思思久久精品导航| h网站免费在线观看| 91丨九色porny丨蝌蚪| 日韩国产在线播放| 欧美又粗又大又爽| 6080亚洲理论片在线观看| 91美女福利视频高清| 婷婷电影在线观看| 亚洲一区久久| 成人免费淫片免费观看| 97人妻一区二区精品免费视频| 亚洲美女高潮久久久| 老司机免费视频一区二区三区| 日韩一区二区三区免费观看| 国产va在线播放| 中文字幕av日韩| 2019中文字幕全在线观看| 两个人免费视频观看日本| 国内精品不卡一区二区三区| 国产在线观看色| 亚洲人www| 熟女人妻一区二区三区免费看| 漫画在线观看av| 久久99国产精品视频| 在线观看日韩av| 天堂tv亚洲tv日本tv欧美人tv| 亚洲第一视频在线观看| 五月天婷婷综合| 91久久嫩草影院一区二区| 国产亚洲色婷婷久久99精品91| 亚洲 国产 日韩 综合一区| 性娇小13――14欧美| 国产69精品久久久久久久| 久久99蜜桃精品| av在线国产精品| 一区二区三区韩国| 欧美野外多人交3| 凹凸日日摸日日碰夜夜爽1| 欧美色图久久| 婷婷激情综合五月天| 国产污视频网站| 青青在线视频一区二区三区| 国产精品久久久久毛片软件| 日韩精品一区二区av| 老鸭窝91久久精品色噜噜导演| 久久国产精品久久w女人spa| www.黄色在线观看| 97视频免费| 在线观看不卡视频| 欧美a极品极品欧美| 伊人精品视频在线观看| 天天做天天爱天天爽综合网| 一级视频在线观看| 国产精品每日更新在线播放网址| 亚洲一级二级三级在线免费观看| 免费色片视频| 久久久久久高清| 亚洲性视频网址| 99re热精品视频| 亚洲成人激情图| 久久精品久久久精品美女| а√资源新版在线天堂| 欧美电影在线观看免费| 色噜噜日韩精品欧美一区二区| 亚洲欧美日韩一区在线观看| 97免费视频在线| 一级特黄aaa| 欧美三级电影精品| 国产成人精品无码高潮| 蝌蚪91视频| 青青草成人免费在线视频| 色一情一乱一伦一区二区三欧美| 狠狠躁夜夜躁av无码中文幕| 欧美国产一区二区三区激情无套| 香蕉视频黄在线观看| 91一区二区三区四区| 欧美日韩一区二区三区电影| 37pao成人国产永久免费视频| 日韩精品视频在线| 日韩欧美aaaaaa| 欧美性视频一区二区三区| av免费在线播放网站| jizzjizz4| 91美女在线| 国产精品久久久久av| 欧美一级网址| 国产麻豆一精品一男同| 欧美亚洲禁片免费| 国产www免费| 日本视频一二三区中文字幕| av手机天堂| 艳女tv在线观看国产一区| 成人满18在线观看网站免费| 国产乱子轮xxx农村| 久久国产精品二区| 亚洲成人18| 日本中文字幕免费在线观看| 最近看过的日韩成人| 欧美成人片在线观看| 手机在线免费观看av| 欧美视频一区二区在线观看| 欧美大波大乳巨大乳| 国产日韩欧美综合精品| 国产精品久久久久精| 欧美日韩高清在线一区| 男人操女人在线观看| 五月天国产在线| 欧美福利视频在线| 亚洲性视频网站| 亚洲午夜精品17c| 日韩精品一线二线三线| 亚洲精品欧美二区三区中文字幕| 99精品欧美一区二区蜜桃免费| 色先锋资源在线播放av| 亚洲第一天堂无码专区| 91高清一区| 欧美粗暴jizz性欧美20| av一区二区三区免费| av最新在线| 欧美视频中文字幕| 97操在线视频| 精品国产一区二区三区av性色| 在线综合+亚洲+欧美中文字幕| 国产精品人人做人人爽人人添| jizzjizzjizz在线观看| 欧美精品一二| 欧美日韩第一页| 国产在线激情视频| 波多野结衣av一区二区全免费观看| 欧美13一14另类| 国产青青草视频| 久久gogo国模啪啪裸体| 2017亚洲男人天堂| 欧美成人手机视频| 麻豆传传媒久久久爱| 欧美电影院免费观看| 国产剧情在线观看一区二区| 手机版av在线| 一级aaaa毛片| 小毛片在线观看| 欧美性孕妇孕交| 精品亚洲国内自在自线福利| 国产又黄又大又爽| 久久青草免费| 91theporn国产在线观看| 激情综合网天天干| 久久99精品久久久久久水蜜桃| 色悠久久久久综合先锋影音下载| 久久精品欧美一区二区三区麻豆| 亚洲制服少妇| 国模少妇一区二区三区| 欧美亚洲综合久久| 国产精品久久久久久五月尺| 国产欧美精品在线播放| 国产精品综合| 国产精品一二| 欧美午夜丰满在线18影院| 91麻豆精品国产综合久久久| 欧美成人二区| 中文字幕不卡每日更新1区2区| 国产精品美女久久久久av爽李琼| 久久资源在线| 福利视频一区二区三区| 在线观影网站| 成人满18在线观看网站免费| 一个色在线综合| 国产精品露脸视频| 久久久久久久黄色| 精品久久久香蕉免费精品视频| 欧美怡红院在线| 久久精品国产**网站演员|