nepster-web
@nepster-web

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

Прочитал про новую штуку в php trait

Сделал первый пример
trait Helper 
{
    public function str($s) 
    {
        return strtoupper($s);
    }
}


class HelloWorld 
{
    use Helper;
    
    public function __construct()
    {
        echo $this->str('test');  
    }
}

$MyHelloWorld = new HelloWorld();


Работа понятна, вопрос чем отличается вышепоказанный пример, от

class Helper {
    public static function str($s) 
    {
        return strtoupper($s);
    }
}


class HelloWorld 
{
    public function __construct()
    {
        echo Helper::str(get_class($this));  
    }
}

$MyHelloWorld = new HelloWorld();


В чем разница и в каких случаях нужно использовать трейты ?
  • Вопрос задан
  • 12379 просмотров
Решения вопроса 2
KorsaR-ZN
@KorsaR-ZN
Они нужны для избавления от дублирования кода, ну или например для множественного наследования.

Грубый пример:
У вас есть много классов, которые что-то записывают в лог, из класса в класс, это один и тот же участок кода, к примеру Logger::write(str), вот этот участок кода можно вынести в трейт LoggerTrait c методом logWrite, и потом во всех классах использовать $this->logWrite(str).
Потом удобно будет эту функцию переопределить в каком-то конкретном файле, если скажем там нужна какая-то специфичная запись в лог.

При таком подходе вы всегда класс логгера можете заменить, просто отредактировав всего один файл трейта, а не 100500 классов.

Еще пример:
В трейт можно вынести функцию isAjaxPost, для проверки, что запрос в контроллер пришел ajax post, и подключать в нужные контроллеры.

Да вообщем море примеров привести можно, где это удобно применять, для избавления от дублирование в коде, от однотипных операций и т.д.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Трейты нужны для уменьшения дублирования кода. Причем выносить в них стоит только тупой код, который не имеет смысла покрывать тестами. Все что делает хоть что нибудь умное в трейте хранить не стоит.

Пример когда трейты хороши - паттерн композиция.

interface A {
    function foo();
}

interface B {
    function bar();
}

trait AImpl {
    function foo() {
        return $this->a->foo();
    }
}

trait BImpl {
    function bar() {
        return $this->b->bar();
    }
}

class AB implements A, B {
    private $a;
    private $b;

    use AImpl;
    use BImpl;

    public function __construct(A $a, B $b) {
        $this->a = $a;
        $this->b = $b;
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
RecruitIT Москва
от 100 000 до 160 000 ₽
от 130 000 до 180 000 ₽
Сбер Москва
До 240 000 ₽
27 окт. 2020, в 04:55
1000 руб./за проект
27 окт. 2020, в 03:49
2000 руб./за проект
27 окт. 2020, в 03:32
800 руб./в час