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()
.