@kot-samolet

Рекомендации по использованию трейтов в PHP?

1) Как избежать ситуации когда я вижу код
$o = new Main();
$o->sayHelloWorld();
$o->sayExclamationMark();

Лезу в класс Main и вижу что метода sayHelloWorld в нём нет. Логически понятно что он не в родителе т.к. было бы другое обращение (через parent::) но это всё равно несколько сбивает с толку, особенно если слово use не сразу заметишь.
Есть ли какие-то best practice и негласные соглашения по их использованию, например писать метод $o->sayHelloWorldTrait(); тогда уже по названию метода понятно и что он делает и откуда берётся.

2) В какой папке хранить трейты если папки проекта разделены на model, view, controller?

3) Вопрос по статическим членам трейта.
Можно сделать в тейте:
trait Counter {
    public function config() {
        static $admin_mail = 'admini@project.com';
    }
}

А можно создать конфиг-класс:
class Configl
{
    public $admin_mail = 'admini@project.com';
}

Как лучше и в чём по сути разница между ними выходит?
  • Вопрос задан
  • 467 просмотров
Решения вопроса 2
qonand
@qonand
Software Engineer
Лезу в класс Main и вижу что метода sayHelloWorld в нём нет. Логически понятно что он не в родителе т.к. было бы другое обращение (через parent::) но это всё равно несколько сбивает с толку, особенно если слово use не сразу заметишь

Установите нормальное IDE и не будет никаких проблем, например в том же PHPStorm кликнув на методе Вы сразу можете перейти к его реализации без лишних поисков и телодвижений

Есть ли какие-то best practice и негласные соглашения по их использованию, например писать метод $o->sayHelloWorldTrait(); тогда уже по названию метода понятно и что он делает и откуда берётся.

Ой сомневаюсь, ибо смысла в них нет. Название метода эта часть интерфейса класса, а трейт он как бы не относиться к описанию интерфейса. Трейт это инструмент позволяющий избавиться от дублирования функционала и не более того.

В какой папке хранить трейты если папки проекта разделены на model, view, controller?

А трейты у Вас к чему относятся? к бизнес-логике, логике обработки запросов или представлению? К какому слою относиться трейт в том и размещайте

Вопрос по статическим членам трейта

Зачем мешать молоко с мухами? Конфиги это - не функционал программы, соответственно смысла размещать их в трейтах вообще нет
Ответ написан
Комментировать
DevMan
@DevMan
kot-samolet,
если принять за данность что метод sayHelloWorld() в Main не обнаружен, то просветите как он может оказаться в родителе?
https://ideone.com/Ofwi0g сюрприз, да?

Lander прав по поводу "кажется Вам рановато трейтами заниматься", ибо нет понимания наследования от слова вообще.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Логически понятно что он не в родителе

Как раз таки он вполне может быть в родителе.

Мне кажется Вам рановато трейтами заниматься. В пока просто не понимаете зачем они нужны в силу того, что плохо понимаете ООП.

upd. И как сказал KorniloFF вполне можно обходится и без них. Я вообще считаю их костылём, который добавили вместо множественного наследования.
Ответ написан
profesor08
@profesor08 Куратор тега PHP
Логически понятно что он не в родителе

И в чем тут логика? Если метода нет в потомке, значит надо искать его в родителе и тд по цепочке.

И ты сам ответил на свой вопрос. Учись замечать `use`.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы