元件(Component)
元件是 Yii 應用的主要基石。是 [[yiiaseComponent]] 類或其子類的範例。三個用以區分它和其它類的主要功能有:
-
屬性(Property)
-
事件(Event)
-
行為(Behavior)
或單獨使用,或彼此配合,這些功能的應用讓 Yii 的類變得更加靈活和易用。以小部件 [[yiijuiDatePicker|日期選擇器]] 來舉例,這是個方便你在 檢視 中生成一個互動式日期選擇器的 UI 元件:
-
use yiijuiDatePicker;
-
-
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 yiicomponentsMyClass;
-
-
use yiiaseObject;
-
-
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()]] 方法內進行初始化後的收尾工作。你可以通過重寫此方法,進行一些良品檢驗,屬性的初始化之類的工作。
-
物件方法呼叫。
前三步都是在物件的構造方法內發生的。這意味著一旦你獲得了一個物件範例,那麼它就已經初始化就緒可供使用。