Страница 1 из 3

Как заинжектить трейт в объект

Добавлено: 2017.04.21, 08:52
pistol
https://github.com/yiisoft/yii2/wiki/Pl ... r-versions - в YII планируется замена поведений на трейты.

А каким образом может быть проинжектен и отинжектен трейт для объекта? $object->attachTrait();? Такой же магией, что и с поведениями или есть какой-то более цивилизованный метод?

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 09:34
ElisDN
Никак.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 09:37
sosnovskiy
Вы почитали про трейты перед тем как задавать подобный вопрос.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 10:31
vitalik1183
ElisDN писал(а): 2017.04.21, 09:34Никак.
Да ну? :)
http://php.net/manual/en/language.oop5. ... visibility

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 10:40
ElisDN
vitalik1183 писал(а): 2017.04.21, 10:31 Да ну? :)
Ну и как его налету приинжектить и отинжектить?

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 10:46
vitalik1183
Что то похожее...

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 10:57
zelenin
vitalik1183 писал(а): 2017.04.21, 10:46 Что то похожее...
по ссылке хак для получения трейтоподобной функциональности на < 5.4 (на момент написания статьи 5.4 еще не вышла).

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 11:51
pistol
Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.

Всем спасибо.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 13:39
maleks
pistol писал(а): 2017.04.21, 11:51 Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.
Из этого:
Try to use traits + events instead of behaviors and drop behaviors.
складывается больше ощущение что полностью поведения хотят удалить.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 14:08
pistol
maleks писал(а): 2017.04.21, 13:39
pistol писал(а): 2017.04.21, 11:51 Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.
Из этого:
Try to use traits + events instead of behaviors and drop behaviors.
складывается больше ощущение что полностью поведения хотят удалить.
Будет жаль, если уберут. Хорошая фича, чтобы, например, быстро расширять геттеры для того же yii::$app->user из любого места системы. Только ценой магии и забивания гвоздей в гроб долговременной поддержки проекта, конечно)

Ну и

Код: Выделить всё

'as behaviorName' => [

]
В конфиге - тоже ломовая фича для переноса повторяющегося опционального функционала. Вряд ли уберут вообще инжект поведений.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 16:24
zelenin
если поведения уберут, то как могут оставить их инжект?

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 18:23
pistol
Поведения переименуют в трейты. Дропнут behaviors().
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.

Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 18:36
zelenin
pistol писал(а): 2017.04.21, 18:23 Поведения переименуют в трейты. Дропнут behaviors().
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.

Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.
нельзя. трейты будут юзаться как трейты.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 18:54
pistol
Проверил - вроде как можно.
Поведения 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();

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 19:12
pistol
pistol писал(а): 2017.04.21, 18:54 сейчас проверю, насколько она присуща трейтам.
Вся магия работает также, как в классах.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 19:15
zelenin
это обычное использование трейтов. собственно трейты это именно это и есть.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 19:16
ElisDN
$this->owner в трейте не нужен. Трейт сам по себе не существует. Владелец - это сам $this.
pistol писал(а): 2017.04.21, 18:23 С трейтами плотно не работал.
Код из трейта через use вливается в класс также, как при include для файлов.
pistol писал(а): 2017.04.21, 19:12 Вся магия работает также, как в классах.
Трейт - это и всего лишь вынесенная запчасть от класса.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 19:19
pistol
ElisDN писал(а): 2017.04.21, 19:16 $this->owner в трейте не нужен. У трейта владелец - это сам $this.
pistol писал(а): 2017.04.21, 18:23 С трейтами плотно не работал.
Код из трейта через use вставляется в класс также, как include и require для кода файлов.
Я все это веду к тому, что если будут использовать не $this, а $this->owner, то можно будет по-старому инжектить методы трейтов:

Код: Выделить всё

$object->attachTrait();
Или через Use вместо behaviors().

Если в документации будут рекомендовать юзать просто $this, то как заинжектить это в объект - не представляю.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 19:21
ElisDN
pistol писал(а): 2017.04.21, 19:19 как заинжектить это в объект - не представляю.
По-старому никак. Трейты - это просто импортируемые куски кода, а не объекты.

Re: Как заинжектить трейт в объект

Добавлено: 2017.04.21, 19:22
zelenin
pistol писал(а): 2017.04.21, 19:19Я все это веду к тому, что если будут использовать не $this, а $this->owner, то можно будет по-старому инжектить методы трейтов:

Код: Выделить всё

$object->attachTrait();
так как инжектить? пример выше - это обычное использование трейтов. там же нет динамического аттача.