yii2中組件什么意思

yii2中組件什么意思

組件是YII框架application(應用)的主要組成部分,它是 [yiibaseComponent]的實例或者子類。組件有三個重要特征(功能):

·屬性(properties)

·事件(events)

·行為(behaviors)

單獨或者組合使用這些特征,可以讓yii框架的類變得更加易用和可定制。舉個例子,引入一個用戶交互組件[yiijuiDataPickerdata picker wigets],可以很輕松的在視圖中生成一個日期選擇控件(jquery ui date picker)。

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

DatePicker掛件的屬性很容易被修改,原因就在于他繼承了類[yiibaseComponet]

盡管組件很強大,但是其開銷也大于普通的類對象,原因在于組件需要額外的內存和CPU時間去處理事件(events)和行為(behaviors).如果你的組件不需要事件和行為這兩個特征(功能),可以直接繼承[yiibaseObject],這樣你的組件在性能(效率)上和普通類對象一致,且支持屬性(properties)。

編寫一個繼承[yiibaseComponent]或者[yiibaseObject]的類,需要遵循以下約定:

????·假設你重寫了構造函數(shù),必須定義一個參數(shù)$config,作為構造函數(shù)的最后一個參數(shù),此參數(shù)被傳遞給父類的構造函數(shù)使用

????·在重寫的構造函數(shù)的結尾必須調用父類的構造函數(shù)

????·假設你重寫了[yiibaseObject::init()|init()]方法,那么必須在重寫的init方法開始調用父類的init方法

舉個例子

namespace?yiicomponentsMyClass; use?yiibaseObject; class?MyClass?extends?Object { ????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 ????} }

遵循如下示例,可使你的組件在創(chuàng)建時屬性即可被配置(初始化):

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

提示:使用[Yii::createOject()]的方式看起來更加復雜,但是因為[Yii::createObject]是基于依賴注入的實現(xiàn),因此更加強大

[yiibaseObject]類強制實現(xiàn)如下生命周期:

(1)在構造函數(shù)里實現(xiàn)預初始化,可以在這個時候設定默認的屬性值;

(2)通過$config配置對象,在構造函數(shù)里通過對象配置可以覆蓋默認值;

(3)在[yiibaseObject::init()|init()]方法里,進行初始化后的配置。可以在init方法里實現(xiàn)例行檢查和屬性正常化檢查;

(4)對象方法調用。

開始的三個階段都在構造函數(shù)里實現(xiàn),這意味著當你得到一個對象的實例時,它已經(jīng)被初始化為適當?shù)臓顟B(tài),可以被放心的使用。

PHP中文網(wǎng),有大量免費的Yii入門教程,歡迎大家學習!

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享