行爲是 yii\base\Behavior 或其子類的實例, 可以無須改變類繼承關係即可增強一個已有的 組件 類功能。所有組件類均可以使用行爲。通常註冊行爲有以下方式:
1 在組件類內部定義behaviors()函數,返回Behavior類數組,即可以是組件類對象訪問行爲內部所有公有屬性或函數方法。
public function behaviors() { return [ TimestampBehavior::class, ]; }
2 配置文件註冊行爲,前綴as,定義行爲名,然後在內部配置類名,初始化屬性。
'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'as a' => [ 'class' => \app\models\B::class, 'id' => 1, ],
使用行爲的原因
行爲類像普通類支持繼承。另一方面,traits 可以視爲 PHP 語言支持的複製粘貼功能, 它不支持繼承。
行爲無須修改組件類就可動態附加到組件或移除。 要使用 traits,必須修改使用它的類。
行爲是可配置的,而 traits 則不可行。
行爲可以通過響應事件來定製組件的代碼執行。
當附屬於同一組件的不同行爲之間可能存在名稱衝突時, 通過優先考慮附加到該組件的行爲, 自動解決衝突。由不同 traits 引起的名稱衝突需要通過 重命名受影響的屬性或方法進行手動解決。
使用 Traits 的原因
Traits 比行爲更有效,因爲行爲是既需要時間又需要內存的對象。
因爲 IDE 是一種本地語言結構,所以它們對 Traits 更友好。