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

目錄
PHP的Yii框架中行為的定義與綁定方法講解,yii框架
您可能感興趣的文章:
首頁 後端開發(fā) php教程 PHP的Yii框架中行為的定義與綁定方法講解,yii框架_PHP教程

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

Jul 12, 2016 am 08:56 AM
php yii

PHP的Yii框架中行為的定義與綁定方法講解,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 方法定義屬性

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

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

靜態(tài)綁定行為,只需要重載 yii\base\Component::behaviors() 就可以了。 這個方法用于描述類所具有的行為。如何描述呢? 使用配置來描述,可以是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',
      ]
    ];
  }
}

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

[
  'as myBehavior2' => MyBehavior::className(),

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

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

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

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

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

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

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

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

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

$behaviors = $Component->getBehaviors();

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

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

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

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

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

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

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

public function ensureBehaviors()
{
  // 為null表示尚未綁定
  // 多說一句,為空數(shù)組表示沒有綁定任何行為
  if ($this->_behaviors === null) {
    $this->_behaviors = [];

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

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

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

private function attachBehaviorInternal($name, $behavior)
{
  // 不是 Behavior 實例,說是只是類名、配置數(shù)組,那么就創(chuàng)建出來吧
  if (!($behavior instanceof Behavior)) {
    $behavior = Yii::createObject($behavior);
  }

  // 匿名行為
  if (is_int($name)) {
    $behavior->attach($this);
    $this->_behaviors[] = $behavior;

  // 命名行為
  } else {

    // 已經(jīng)有一個同名的行為,要先解除,再將新的行為綁定上去。
    if (isset($this->_behaviors[$name])) {
      $this->_behaviors[$name]->detach();
    }
    $behavior->attach($this);
    $this->_behaviors[$name] = $behavior;
  }
  return $behavior;
}

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

如果 $behavior 參數(shù)并非是一個 Behavior 實例,就以之為參數(shù),用 Yii::createObject() 創(chuàng)建出來。
如果以匿名行為的形式綁定行為,那么直接將行為附加在這個類上。
如果是命名行為,先看看是否有同名的行為已經(jīng)綁定在這個類上,如果有,用后來的行為取代之前的行為。
在 yii\base\Component::attachBehaviorInternal() 中, 以 $this 為參數(shù)調(diào)用了 yii\base\Behavior::attach() 。 從而,引出了跟綁定相關(guān)的最后一個家伙 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);
  }
}

上面的代碼干了兩件事:

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

總結(jié)

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

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

您可能感興趣的文章:

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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1111897.htmlTechArticlePHP的Yii框架中行為的定義與綁定方法講解,yii框架 定義行為 要定義行為,通過繼承 yii\base\Behavior 或其子類來建立一個類。如: namespace a...
本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔相應(yīng)的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何使用PHP退出功能? 如何使用PHP退出功能? Jul 03, 2025 am 02:15 AM

exit()是PHP中用於立即終止腳本執(zhí)行的函數(shù),常見用途包括:1.在檢測到異常情況時提前終止腳本,如文件不存在或驗證失?。?.調(diào)試時輸出中間結(jié)果並停止執(zhí)行;3.結(jié)合header()重定向後調(diào)用exit()防止後續(xù)代碼執(zhí)行;此外,exit()可接受字符串參數(shù)作為輸出內(nèi)容或整數(shù)作為狀態(tài)碼,其別名為die()。

將語義結(jié)構(gòu)應(yīng)用於html的文章,部分和旁邊 將語義結(jié)構(gòu)應(yīng)用於html的文章,部分和旁邊 Jul 05, 2025 am 02:03 AM

在HTML中合理使用語義化標籤能提升頁面結(jié)構(gòu)清晰度、可訪問性和SEO效果。 1.用於獨立內(nèi)容區(qū)塊,如博客文章或評論,需保持自包含性;2.用於歸類相關(guān)內(nèi)容,通常包含標題,適用於頁面不同模塊;3.用於與主內(nèi)容相關(guān)但非核心的輔助信息,如側(cè)邊欄推薦或作者簡介。實際開發(fā)中應(yīng)結(jié)合、等標籤,避免過度嵌套,保持結(jié)構(gòu)簡潔,並通過開發(fā)者工具驗證結(jié)構(gòu)合理性。

請求的操作需要高程窗戶 請求的操作需要高程窗戶 Jul 04, 2025 am 02:58 AM

遇到“此操作需要提升權(quán)限”提示時,說明你需要管理員權(quán)限才能繼續(xù)。解決方法包括:1.右鍵選擇“以管理員身份運行”程序或設(shè)置快捷方式始終以管理員身份運行;2.檢查當前賬戶是否為管理員賬戶,若不是則切換或請求管理員協(xié)助;3.用管理員權(quán)限打開命令提示符或PowerShell執(zhí)行相關(guān)命令;4.在必要時通過獲取文件所有權(quán)或修改註冊表等手段繞過限制,但此類操作需謹慎並充分了解風(fēng)險。確認權(quán)限身份並嘗試上述方法通??山鉀Q問題。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗證來源與類型、控製文件名與路徑、設(shè)置服務(wù)器限制並二次處理媒體文件。 1.驗證上傳來源通過token防止CSRF並通過finfo_file檢測真實MIME類型使用白名單控制;2.重命名文件為隨機字符串並根據(jù)檢測類型決定擴展名存儲至非Web目錄;3.PHP配置限制上傳大小及臨時目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

您如何按值與PHP中的參考傳遞變量? 您如何按值與PHP中的參考傳遞變量? Jul 08, 2025 am 02:42 AM

InPHP,variablesarepassedbyvaluebydefault,meaningfunctionsorassignmentsreceiveacopyofthedata,whilepassingbyreferenceallowsmodificationstoaffecttheoriginalvariable.1.Whenpassingbyvalue,changestothecopydonotimpacttheoriginal,asshownwhenassigning$b=$aorp

PHP找到了最後一次發(fā)生的位置 PHP找到了最後一次發(fā)生的位置 Jul 09, 2025 am 02:49 AM

在PHP中查找子字符串最後一次出現(xiàn)的位置,最直接的方法是使用strrpos()函數(shù)。 1.使用strrpos()函數(shù)可直接獲取子字符串在主字符串中最後一次出現(xiàn)的起始位置索引,若未找到則返回false,語法為strrpos($haystack,$needle,$offset=0)。 2.若需忽略大小寫,可使用strripos()函數(shù)實現(xiàn)不區(qū)分大小寫的查找。 3.對於中文等多字節(jié)字符,應(yīng)使用mbstring擴展中的mb_strrpos()函數(shù)以確保返回字符位置而非字節(jié)位置。 4.注意strrpos()返回f

PHP標頭位置AJAX調(diào)用不起作用 PHP標頭位置AJAX調(diào)用不起作用 Jul 10, 2025 pm 01:46 PM

AJAX請求中header('Location:...')無效的原因是瀏覽器不會自動執(zhí)行頁面跳轉(zhuǎn)。因為在AJAX請求中,服務(wù)器返回的302狀態(tài)碼和Location頭信息會被作為響應(yīng)數(shù)據(jù)處理,而不是觸發(fā)跳轉(zhuǎn)行為。解決方法有:1.在PHP中返回JSON數(shù)據(jù)包含跳轉(zhuǎn)URL;2.在前端AJAX回調(diào)中檢查redirect字段並用window.location.href手動跳轉(zhuǎn);3.確保PHP輸出僅為JSON避免解析失?。?.處理跨域問題需設(shè)置合適的CORS頭;5.防止緩存干擾可加時間戳或設(shè)置cache:f

如何在YII中創(chuàng)建基本路線? 如何在YII中創(chuàng)建基本路線? Jul 09, 2025 am 01:15 AM

TocreateabasicrouteinYii,firstsetupacontrollerbyplacingitinthecontrollersdirectorywithpropernamingandclassdefinitionextendingyii\web\Controller.1)Createanactionwithinthecontrollerbydefiningapublicmethodstartingwith"action".2)ConfigureURLstr

See all articles