元件(Component)


元件(Component)

元件是 Yii 應用的主要基石。是 [[yiiaseComponent]] 類或其子類的範例。三個用以區分它和其它類的主要功能有:

  • 屬性(Property)
  • 事件(Event)
  • 行為(Behavior)

或單獨使用,或彼此配合,這些功能的應用讓 Yii 的類變得更加靈活和易用。以小部件 [[yiijuiDatePicker|日期選擇器]] 來舉例,這是個方便你在 檢視 中生成一個互動式日期選擇器的 UI 元件:

  1. use yiijuiDatePicker; 
  2.  
  3. echo DatePicker::widget([ 
  4.     'language' => 'zh-CN', 
  5.     'name'  => 'country', 
  6.     'clientOptions' => [ 
  7.         'dateFormat' => 'yy-mm-dd', 
  8.     ], 
  9. ]);

這個小部件繼承自 [[yiiaseComponent]],它的各項屬性改寫起來會很容易。

正是因為元件功能的強大,他們比常規的物件(Object)稍微重量級一點,因為他們要使用額外的記憶體和 CPU 時間來處理 事件 和 行為 。如果你不需要這兩項功能,可以繼承 [[yiiaseObject]] 而不是 [[yiiaseComponent]]。這樣元件可以像普通 PHP 物件一樣高效,同時還支援性(Property)功能。

當繼承 [[yiiaseComponent]] 或 [[yiiaseObject]] 時,推薦你使用如下的編碼風格:

  • 若你需要重寫構造方法(Constructor),傳入 $config 作為構造器方法最後一個引數,然後把它傳遞給父類別的構造方法。
  • 永遠在你重寫的構造方法結尾處呼叫一下父類別的構造方法。
  • 如果你重寫了 [[yiiaseObject::init()]] 方法,請確保你在 init 方法的開頭處呼叫了父類別的 init 方法。

例子如下:

  1. namespace yiicomponentsMyClass; 
  2.  
  3. use yiiaseObject; 
  4.  
  5. class MyClass extends Object 
  6.     public $prop1; 
  7.     public $prop2; 
  8.  
  9.     public function __construct($param1, $param2, $config = []) 
  10.     { 
  11.         // ... 組態生效前的初始化過程 
  12.  
  13.         parent::__construct($config); 
  14.     } 
  15.  
  16.     public function init() 
  17.     { 
  18.         parent::init(); 
  19.  
  20.         // ... 組態生效後的初始化過程 
  21.     } 
  22. }

另外,為了讓元件可以在建立範例時能被正確組態,請遵照以下操作流程:

  1. $component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]); 
  2. // 方法二: 
  3. $component = Yii::createObject([ 
  4.     'class' => MyClass::className(), 
  5.     'prop1' => 3, 
  6.     'prop2' => 4, 
  7. ], [1, 2]);

補充:儘管呼叫 [[Yii::createObject()]] 的方法看起來更加複雜,但這主要因為它更加靈活強大,它是基於賴注入容器實現的。

[[yiiaseObject]] 類執行時的生命週期如下:

  1. 構造方法內的預初始化過程。你可以在這兒給各屬性設定預設值。
  2. 通過 $config 組態物件。組態的過程可能會覆蓋掉先前在構造方法內設定的預設值。
  3. 在 [[yiiaseObject::init()|init()]] 方法內進行初始化後的收尾工作。你可以通過重寫此方法,進行一些良品檢驗,屬性的初始化之類的工作。
  4. 物件方法呼叫。

前三步都是在物件的構造方法內發生的。這意味著一旦你獲得了一個物件範例,那麼它就已經初始化就緒可供使用。