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


В чем разница и в каких случаях нужно использовать трейты ?
  • Вопрос задан
  • 14971 просмотр
Решения вопроса 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;
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
04 мая 2024, в 22:32
2000 руб./за проект
04 мая 2024, в 22:10
2001 руб./за проект
04 мая 2024, в 21:12
10000 руб./за проект