組件(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. 對象方法調用。

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