国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

??
PHP的Yii框架中行為的定義與綁定方法講解,yii框架
您可能感興趣的文章:
? ??? ?? PHP ???? PHP的Yii框架中行為的定義與綁定方法講解,yii框架_PHP教程

PHP的Yii框架中行為的定義與綁定方法講解,yii框架_PHP教程

Jul 12, 2016 am 08:56 AM
php yii

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

定義行為

要定義行為,通過(guò)繼承 yii\base\Behavior 或其子類來(lái)建立一個(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 是通過(guò) getter getProp2() 和 setter setProp2() 定義的。能這樣用是因?yàn)?yii\base\Object 是 yii\base\Behavior 的祖先類,此祖先類支持用 getter 和 setter 方法定義屬性

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

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

靜態(tài)綁定行為,只需要重載 yii\base\Component::behaviors() 就可以了。 這個(gè)方法用于描述類所具有的行為。如何描述呢? 使用配置來(lái)描述,可以是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)的綁定辦法,就是通過(guò)配置文件來(lá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ì)于沒(méi)有提供鍵名的行為,就是匿名行為。

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

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

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

$behaviors = $Component->getBehaviors();

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

只是重載一個(gè) yii\base\Component::behaviors() 就可以這么神奇地使用行為了? 這只是冰山的一角,實(shí)際上關(guān)系到綁定的過(guò)程,有關(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表示尚未綁定
  // 多說(shuō)一句,為空數(shù)組表示沒(méi)有綁定任何行為
  if ($this->_behaviors === null) {
    $this->_behaviors = [];

    // 遍歷 $this->behaviors() 返回的數(shù)組,并綁定
    foreach ($this->behaviors() as $name => $behavior) {
      $this->attachBehaviorInternal($name, $behavior);
    }
  }
}

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

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

private function attachBehaviorInternal($name, $behavior)
{
  // 不是 Behavior 實(shí)例,說(shuō)是只是類名、配置數(shù)組,那么就創(chuàng)建出來(lái)吧
  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)建出來(lái)。
如果以匿名行為的形式綁定行為,那么直接將行為附加在這個(gè)類上。
如果是命名行為,先看看是否有同名的行為已經(jīng)綁定在這個(gè)類上,如果有,用后來(lái)的行為取代之前的行為。
在 yii\base\Component::attachBehaviorInternal() 中, 以 $this 為參數(shù)調(diào)用了 yii\base\Behavior::attach() 。 從而,引出了跟綁定相關(guān)的最后一個(gè)家伙 yii\base\Behavior::attach() , 這也是前面我們講行為的要素時(shí)沒(méi)講完的。先看看代碼:

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

上面的代碼干了兩件事:

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

總結(jié)

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

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

您可能感興趣的文章:

  • PHP的Yii框架中移除組件所綁定的行為的方法
  • 詳解在PHP的Yii框架中使用行為Behaviors的方法
  • 深入講解PHP的Yii框架中的屬性(Property)
  • PHP的Yii框架中使用數(shù)據(jù)庫(kù)的配置和SQL操作實(shí)例教程
  • 深入解析PHP的Yii框架中的event事件機(jī)制
  • 全面解讀PHP的Yii框架中的日志功能
  • Yii使用find findAll查找出指定字段的實(shí)現(xiàn)方法
  • 解析yii數(shù)據(jù)庫(kù)的增刪查改
  • Yii PHP Framework實(shí)用入門教程(詳細(xì)介紹)
  • 詳解PHP的Yii框架中組件行為的屬性注入和方法注入

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1111897.htmlTechArticlePHP的Yii框架中行為的定義與綁定方法講解,yii框架 定義行為 要定義行為,通過(guò)繼承 yii\base\Behavior 或其子類來(lái)建立一個(gè)類。如: namespace a...
? ????? ??
? ?? ??? ????? ???? ??? ??????, ???? ?????? ????. ? ???? ?? ???? ?? ??? ?? ????. ???? ??? ???? ???? ??? ?? admin@php.cn?? ?????.

? AI ??

Undresser.AI Undress

Undresser.AI Undress

???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover

AI Clothes Remover

???? ?? ???? ??? AI ?????.

Video Face Swap

Video Face Swap

??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

???

??? ??

???++7.3.1

???++7.3.1

???? ?? ?? ?? ???

SublimeText3 ??? ??

SublimeText3 ??? ??

??? ??, ???? ?? ????.

???? 13.0.1 ???

???? 13.0.1 ???

??? PHP ?? ?? ??

???? CS6

???? CS6

??? ? ?? ??

SublimeText3 Mac ??

SublimeText3 Mac ??

? ??? ?? ?? ?????(SublimeText3)

???

??? ??

?? ????
1747
16
Cakephp ????
1600
56
??? ????
1542
28
PHP ????
1400
31
???
PHP? CSRF (Cross-Site Request Properery) ??? ????? ????????? PHP? CSRF (Cross-Site Request Properery) ??? ????? ????????? Jun 28, 2025 am 02:25 AM

TopreventCSRFattacksinPHP,implementanti-CSRFtokens.1)Generateandstoresecuretokensusingrandom_bytes()orbin2hex(random_bytes(32)),savethemin$_SESSION,andincludetheminformsashiddeninputs.2)ValidatetokensonsubmissionbystrictlycomparingthePOSTtokenwiththe

? ?? PHP ?? ?? ?? ???? ??? ?????? ? ?? PHP ?? ?? ?? ???? ??? ?????? Jul 02, 2025 pm 05:18 PM

? ?? PHP ??? ???? ?? ? ?? ????? ? ?? ?? ??? ????. 1. ??? ??? ?? ?? ??? ?? Array_Merge ? Array_unique ??? ??????. ?? Array_Merge ($ array1, $ array2)? ?? ? ?? Array_Unique ()? ???? ?? ?? ? ?? ???? ? ??? ?????. 2. ?? ?? ? ? ?? ???? ? ? ?? ????? ???? ??????. $ result = $ array1 $ array2? ? ?? ??? ?? ? ?? ??? ?? ?? ?? ??????. ? ? ?? ??? ? ??? ????? ??? ?? ?

PHP ?? ??? ???? ??? ?????? PHP ?? ??? ???? ??? ?????? Jul 03, 2025 am 02:15 AM

EXIT ()? ???? ??? ?? ???? ? ???? PHP? ?????. ???? ???? ??? ?????. 1. ??? ???? ??? ??? ???? ?? ?? ??? ?? ? ? ????? ?? ?????. 2. ??? ? ?? ?? ?? ? ?? ??; 3. ?? ?? ??? ???? ?? Header ()? ?? ???? ? Exit ()? ??????. ?? exit ()? ??? ?? ??? ?? ??? ?? ??? ?? ??? ?? ? ? ??? ??? ?? ()???.

HTML?? ??, ?? ? ???? ??? ?? ?? HTML?? ??, ?? ? ???? ??? ?? ?? Jul 05, 2025 am 02:03 AM

HTML?? ??? ??? ????? ???? ??? ?? ???, ??? ? SEO ??? ?? ? ? ????. 1. ??? ????? ??? ?? ??? ? ??? ??? ????? ?? ????????. 2. ????? ??? ???? ?? ?? ???? ???? ???? ?? ??? ?????. 3. ? ???? ??? ?? ??? ????? ??? ? ?? ?? ?? ?? ????? ?? ??? ????. ?? ???? ??? ??????? ?? ??? ??? ??? ???? ???? ??? ??? ?? ??? ???? ???????.

PHP? ?? ???? ??? ??????? PHP? ?? ???? ??? ??????? Jun 30, 2025 am 01:33 AM

PHP? ?? ???? ?????? ?? ??? ??? ?? $ _session hyperglobal ???? ?? ???????. 1. ??? session_start ()? ???? ??????, ?? ?? ??? ???????. 2. ?? ???? ??? ? ? ?? ????? ??????. ISSET ($ _ session [ 'key']) ?? array_key_exists ( 'key', $ _ session)? ??? ? ????. 3. ?? ??? ????? ????????. ?? ???? $ _session ??? ?? ???????. 4. UNSET ($ _ session [ 'key'])? ?? ???? ??? ?? ???? ??? $ _session? ? ??? ??????.

PHP? ?? ??? ?????? PHP? ?? ??? ?????? Jun 29, 2025 am 02:02 AM

?? ??? PHP? ?? ? ??? ?????. ?? ??? 1???. ?? ??? ???? (?? ?), 2. ??? ???? ?? ??? ???? (?? ?). ?? ? ??? ????, ?? ?? ??? ?????, ?? ?? ??, ???? ???? ?? ?? ?? ??? ??? ?????, ??? ?? ? ?? ?? ???? ?????? ???????. ?? ?? ?? ??? ??????? ?? ??? ?? ?????? ?? ?? ??? ????? ?? ??? ????????. ?? ??, ????? ?? ? ? ??? ?? ????? ???? ?? ??? ?? ? ??? ?? ??? ?????.

PHP?? ??? ??? ??? PHP?? ??? ??? ??? Jul 02, 2025 pm 05:01 PM

PHP?? ??? ???? ? ?? ??? ???? : ?? () ??? ????? ???? ?????? []. 1. ?? () ??? ???? ?? ???? ???? ???? ?????. $ fruits = array ( "Apple", "Banana", "Orange")? ?? ??? ???? ???? $ user = array ( "name"=> "john", "age"=> 25)? ?? ?? ??; 2. [] ??? $ color? ?? PHP5.4 ??? ? ??? ?? ?????.

?? ? ???? ?? ?? ????? ?? ? ???? ?? ?? ????? Jul 04, 2025 am 02:58 AM

"? ???? ?? ??????? ????"? ????? ???? ??? ??? ?? ????? ?? ?????. ????? ??? ?????. 1. "???? ??"????? ??? ??? ???? ????? ?? ???? ????? ?? ??? ??????. 2. ?? ??? ??? ???? ???? ??? ??? ??? ????? ??????. 3. ??? ??? ???? ?? ???? ?? PowerShell? ?? ?? ??? ?????. 4. ?? ???? ??? ??? ? ?????? ???? ??? ????? ??? ??? ???? ??? ??? ???????. ?? ??? ???? ?? ??? ???? ????? ??? ??????.

See all articles