Yii framework. Поведение или трейт (Behavior or Trait)

Повторное использование кода всегда считалось (и считается) хорошим тоном и современные ЯП предлагают нам достаточно широкий набор возможностей это осуществить. Сегодня поговорим об особенностях использования поведений и трейтов в Yii2.
Еще в первой версии Yii framework мне очень понравились концепция с поведениями. Я считаю, что в то время это было прекрасным решением. Но с выходом PHP 5.4.0 их начали вытеснять трейты. Сейчас в большем количестве случаев я использую именно их. Сейчас расскажу что и в каких случаях использую я.
Traits
Плюсы
- Они быстрее. Это же конструкция языка.
- При их использовании расходуется меньше памяти.
- Можно описать статические методы и поля.
Минусы
- Напрямую нельзя навесить на события свой обработчик. Но это, как правило, решается аттачем на события в методе init(). Это сработает если данный метод не описан в "классе-родителе".
- В PhpStorm 8 неправильно подсвечивается синтаксис
Behaviors
Плюсы
- События yii навешиваются без труда.
- PhpStorm 8 корректно подсвечивает синтаксис.
Минусы
- Нельзя описать статические методы и поля.
- Медленнее, "жирнее" по памяти.
Пример добавления обработчиков событий в trait
Обычно я создаю метод attachEventHandlers() в котором навешиваю на модель необходимые обработчики.
protected function attachEventHandlers()
{
$this->on(Foo::EVENT_HELLO, [$object, 'methodHello']);
$this->on(Foo::EVENT_BYU, ['app\components\Bar', 'methodBye']);
}
А в методе init() просто его вызываю.
public function init()
{
parent::init();
$this->attachEventHandlers();
}
Это работает, если в родительском классе не переопределяется init(). В противном случае, просто добавляю в него вызов $this->attachEventHandlers().
