1 關注者

組件

組件是 Yii 應用程式的主要構建模組。組件是 yii\base\Component 或擴展類別的實例。組件為其他類別提供的三個主要功能是

這些功能單獨或組合使用,使 Yii 類別更具可自訂性且更易於使用。例如,內建的 yii\jui\DatePicker(一個用戶界面組件)可以用於視圖中,以生成互動式日期選擇器

use yii\jui\DatePicker;

echo DatePicker::widget([
    'language' => 'ru',
    'name'  => 'country',
    'clientOptions' => [
        'dateFormat' => 'yy-mm-dd',
    ],
]);

由於該類別擴展了 yii\base\Component,因此可以輕鬆寫入小部件的屬性。

雖然組件非常強大,但它們比普通物件稍微笨重,因為特別是支援事件行為功能需要額外的記憶體和 CPU 時間。如果您的組件不需要這兩個功能,您可以考慮從 yii\base\BaseObject 而不是 yii\base\Component 擴展您的組件類別。這樣做將使您的組件與普通 PHP 物件一樣高效,但增加了對屬性的支援。

當從 yii\base\Componentyii\base\BaseObject 擴展您的類別時,建議您遵循這些慣例

  • 如果您覆寫建構子,請指定 $config 參數作為建構子的最後一個參數,然後將此參數傳遞給父類別建構子。
  • 始終在覆寫建構子的末尾調用父類別建構子。
  • 如果您覆寫 yii\base\BaseObject::init() 方法,請確保在 init() 方法的開頭調用 init() 的父類別實作。

例如

<?php

namespace yii\components\MyClass;

use yii\base\BaseObject;

class MyClass extends BaseObject
{
    public $prop1;
    public $prop2;

    public function __construct($param1, $param2, $config = [])
    {
        // ... initialization before configuration is applied

        parent::__construct($config);
    }

    public function init()
    {
        parent::init();

        // ... initialization after configuration is applied
    }
}

遵循這些指南將使您的組件在創建時可配置。例如

$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// alternatively
$component = \Yii::createObject([
    'class' => MyClass::class,
    'prop1' => 3,
    'prop2' => 4,
], [1, 2]);

資訊:雖然調用 Yii::createObject() 的方法看起來更複雜,但它更強大,因為它是基於依賴注入容器實現的。

yii\base\BaseObject 類別強制執行以下物件生命週期

  1. 建構子內的預先初始化。您可以在此處設置預設屬性值。
  2. 通過 $config 進行物件配置。配置可能會覆寫在建構子中設置的預設值。
  3. init() 內的後初始化。您可以覆寫此方法以執行健全性檢查和屬性的規範化。
  4. 物件方法調用。

前三個步驟都發生在物件的建構子中。這表示一旦您獲得類別實例(即物件),該物件就已經初始化為適當、可靠的狀態。

發現錯字或您認為此頁面需要改進嗎?
在 github 上編輯 !