Динамические трейты

jonjonson

Охренеть
Другими словами... Хочу запутанную магию, а потом приду на форум и вынесу мозг, почему что-то не работает?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Нет такого места. Тебе правильно сказали, программирование - не твое.
 

StalkerClasses

Новичок
Нет такого места. Тебе правильно сказали, программирование - не твое.
Лучше пример - вот и скажи как сделать динамический трейт.
Еще раз повторусь у меня есть место где это актуально - по крайней мере я пока так думаю.

У меня в каждом трейте есть переменная которую я добавляю в класс.
Но мне важно последовательность в которой будут добавляться трейты в класс, т.е. переменные в трейтах.

Трейты можно добавить в любой последовательности.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ты не понимаешь что такое трейт, не понимаешь, зачем ООП, не понимаешь, что написано в документации "у тебя актуально и нужно" куча вещей, которые никто больше из профессионалов не делает... но прав-то конечно, ты.
 

fixxxer

К.О.
Партнер клуба
Трейт статический по его устройству. Это по сути автоматизированный copy-paste на этапе компиляции кода.

Если такое хочется, значит, надо посмотреть в сторону паттернов типа Visitor или Strategy.
 

WMix

герр M:)ller
Партнер клуба
:)
PHP:
class A{}

trait B{
    public function foo(){
        return 'foo';
    }
}

trait C{
    public function bar(){
        return 'bar';
    }
}

function getObjectWithTrait( $class, $trait ){
    $tmpfname = tempnam("/tmp", "FOO");
    file_put_contents($tmpfname, "<"."?php return new class extends ".$class."{ use ".$trait.";};");
    return include $tmpfname;
}

echo getObjectWithTrait( 'A', 'B' )->foo();
echo getObjectWithTrait( 'A', 'C' )->bar();
 

Yoskaldyr

.
Партнер клуба
@WMix Для таких одаренных, как ТС и tempnam с file_put_contents не заработают :)
Лучше уж сразу eval !

P.S. Хотя eval тоже может быть отключен в конфиге php...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
серьезно? такой детский сад? 🤦‍♂️

PHP:
<?php
trait T1{
    function foo(){echo 123;}
}
trait T2{
    function foo(){echo 456;}
}

class A{}

$my_obj = true ? new class extends A{use T1;} : new class extends A{use T2;};

(function (A $T) {$T->foo();} )($my_obj);
Прямо так делать не надо, но синтаксис надо знать. С закрытым конструктором и фабрикой - почему бы и нет, стратегия как стратегия.
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Так важно, или в любой?
 

StalkerClasses

Новичок
Хорошо, ну а если добавить трейты в класс, есть ли возможность сделать сортировку последовательность в которой они пойдут.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
чукча не читатель
мы работаем не с классами, мы работаем с объектами, это хорошо описано в документации,
про последовательность трейтов тоже написано в документации, повторять никто не будет,
и если ты с первого раза не понял, что трейты указываются статически - это твои проблемы,
решение в 1 строку выше я написал, если ты не понимаешь одну строку кода - это твои проблемы, хватит клоунады
 
Последнее редактирование:

StalkerClasses

Новичок
Возможно как-то в трейт передать параметры?
У меня есть в трейте переменная и аннотация к ней - возможно их как-то переопределить?
 
Сверху