組件(Component)
組件(Component)
組件是 Yii 應用的主要基石。是 [[yiiaseComponent]] 類或其子類的實例。三個用以區分它和其它類的主要功能有:
- 屬性(Property)
- 事件(Event)
- 行為(Behavior)
或單獨使用,或彼此配合,這些功能的應用讓 Yii 的類變得更加靈活和易用。以小部件 [[yiijuiDatePicker|日期選擇器]] 來舉例,這是個方便你在 視圖 中生成一個交互式日期選擇器的 UI 組件:
- use yii\jui\DatePicker;
- echo DatePicker::widget([
- 'language' => 'zh-CN',
- 'name' => 'country',
- 'clientOptions' => [
- 'dateFormat' => 'yy-mm-dd',
- ],
- ]);
這個小部件繼承自 [[yiiaseComponent]],它的各項屬性改寫起來會很容易。
正是因為組件功能的強大,他們比常規的對象(Object)稍微重量級一點,因為他們要使用額外的內存和 CPU 時間來處理 事件 和 行為 。如果你不需要這兩項功能,可以繼承 [[yiiaseObject]] 而不是 [[yiiaseComponent]]。這樣組件可以像普通 PHP 對象一樣高效,同時還支持屬性(Property)功能。
當繼承 [[yiiaseComponent]] 或 [[yiiaseObject]] 時,推薦你使用如下的編碼風格:
- 若你需要重寫構造方法(Constructor),傳入 $config 作為構造器方法最後一個參數,然後把它傳遞給父類的構造方法。
- 永遠在你重寫的構造方法結尾處調用一下父類的構造方法。
- 如果你重寫了 [[yiiaseObject::init()]] 方法,請確保你在 init 方法的開頭處調用了父類的 init 方法。
例子如下:
- namespace yii\components\MyClass;
- use yii\base\Object;
- class MyClass extends Object
- {
- public $prop1;
- public $prop2;
- public function __construct($param1, $param2, $config = [])
- {
- // ... 配置生效前的初始化過程
- parent::__construct($config);
- }
- public function init()
- {
- parent::init();
- // ... 配置生效後的初始化過程
- }
- }
另外,為了讓組件可以在創建實例時能被正確配置,請遵照以下操作流程:
- $component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
- // 方法二:
- $component = \Yii::createObject([
- 'class' => MyClass::className(),
- 'prop1' => 3,
- 'prop2' => 4,
- ], [1, 2]);
補充:儘管調用 [[Yii::createObject()]] 的方法看起來更加複雜,但這主要因為它更加靈活強大,它是基於依賴注入容器實現的。
[[yiiaseObject]] 類執行時的生命周期如下:
- 構造方法內的預初始化過程。你可以在這兒給各屬性設置缺省值。
- 通過 $config 配置對象。配置的過程可能會覆蓋掉先前在構造方法內設置的默認值。
- 在 [[yiiaseObject::init()|init()]] 方法內進行初始化後的收尾工作。你可以通過重寫此方法,進行一些良品檢驗,屬性的初始化之類的工作。
- 對象方法調用。
前三步都是在對象的構造方法內發生的。這意味著一旦你獲得了一個對象實例,那麼它就已經初始化就緒可供使用。