Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

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

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

  • 2016-03-11 19:25:26