Как заинжектить трейт в объект
Как заинжектить трейт в объект
https://github.com/yiisoft/yii2/wiki/Pl ... r-versions - в YII планируется замена поведений на трейты.
А каким образом может быть проинжектен и отинжектен трейт для объекта? $object->attachTrait();? Такой же магией, что и с поведениями или есть какой-то более цивилизованный метод?
А каким образом может быть проинжектен и отинжектен трейт для объекта? $object->attachTrait();? Такой же магией, что и с поведениями или есть какой-то более цивилизованный метод?
-
- Сообщения: 239
- Зарегистрирован: 2017.03.28, 20:03
Re: Как заинжектить трейт в объект
Вы почитали про трейты перед тем как задавать подобный вопрос.
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Как заинжектить трейт в объект
Ну и как его налету приинжектить и отинжектить?
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Как заинжектить трейт в объект
по ссылке хак для получения трейтоподобной функциональности на < 5.4 (на момент написания статьи 5.4 еще не вышла).
Re: Как заинжектить трейт в объект
Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.
Всем спасибо.
Всем спасибо.
Re: Как заинжектить трейт в объект
Будет жаль, если уберут. Хорошая фича, чтобы, например, быстро расширять геттеры для того же yii::$app->user из любого места системы. Только ценой магии и забивания гвоздей в гроб долговременной поддержки проекта, конечно)
Ну и
Код: Выделить всё
'as behaviorName' => [
]
Re: Как заинжектить трейт в объект
если поведения уберут, то как могут оставить их инжект?
Re: Как заинжектить трейт в объект
Поведения переименуют в трейты. Дропнут behaviors().
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.
Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.
Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.
Re: Как заинжектить трейт в объект
нельзя. трейты будут юзаться как трейты.pistol писал(а): ↑2017.04.21, 18:23 Поведения переименуют в трейты. Дропнут behaviors().
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.
Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.
Re: Как заинжектить трейт в объект
Проверил - вроде как можно.
Поведения YII не так устроены сейчас?
UPD: убрал магию, сейчас проверю, насколько она присуща трейтам.
Поведения YII не так устроены сейчас?
UPD: убрал магию, сейчас проверю, насколько она присуща трейтам.
Код: Выделить всё
<?php
//Упрощенный yii::$app
class Yii
{
public static $app = [];
}
//Упрощенный yii\base\Trait
trait YiiTrait
{
function getOwner()
{
return Yii::$app['Obj'];
}
}
//Пользовательский трейт
trait Tr
{
use YiiTrait;
function sum()
{
return $this->getOwner()->x + $this->getOwner()->y;
}
}
//Пользовательский компонент
class Obj
{
use Tr;
public $x;
public $y;
public function __construct($x, $y)
{
$this->x = $x;
$this->y = $y;
}
}
//Инит приложения
Yii::$app = [
'Obj' => new Obj(1, 2),
];
//Вызов метода из трейта, который использует $this->owner
echo Yii::$app['Obj']->sum();
Последний раз редактировалось pistol 2017.04.21, 19:12, всего редактировалось 1 раз.
Re: Как заинжектить трейт в объект
это обычное использование трейтов. собственно трейты это именно это и есть.
Re: Как заинжектить трейт в объект
$this->owner в трейте не нужен. Трейт сам по себе не существует. Владелец - это сам $this.
Код из трейта через use вливается в класс также, как при include для файлов.
Трейт - это и всего лишь вынесенная запчасть от класса.
Re: Как заинжектить трейт в объект
Я все это веду к тому, что если будут использовать не $this, а $this->owner, то можно будет по-старому инжектить методы трейтов:
Код: Выделить всё
$object->attachTrait();
Если в документации будут рекомендовать юзать просто $this, то как заинжектить это в объект - не представляю.
Последний раз редактировалось pistol 2017.04.21, 19:21, всего редактировалось 1 раз.
Re: Как заинжектить трейт в объект
так как инжектить? пример выше - это обычное использование трейтов. там же нет динамического аттача.pistol писал(а): ↑2017.04.21, 19:19Я все это веду к тому, что если будут использовать не $this, а $this->owner, то можно будет по-старому инжектить методы трейтов:
Код: Выделить всё
$object->attachTrait();