Koenig, какую критику ты от меня ожидаешь? Конкретно по трейтам, или по решению в целом?
Delphinum, нормально получилось, или трэйты так не используют, ну и критика в целом, доку не писал
Ну трейты изначально создавались для реализации модели микситов в PHP. Странное решение конечно, но работает и вполне удобно. Я использую трейты следующим образом:
1. Определяю интерфейсы - интерфейс это описание возможностей некоторого объекта. Так, интерфейс Transaction, на пример, может использоваться для класса MySQL, если он умеет использовать транзакции, а интерфейс Cached определяет, что MySQL умеет кешировать.
2. Определяю трейты для общей логики - трейт это реализация конкретного интерфейса или его части. Так, интерфейс Cached может быть реализован не только для базы (класса MySQL), но и, скажем, для работы с файлами (класс File), в этом случае оба решения будут реализовывать интерфейс, но, хорошо написанный трейт, позволит просто добавить уже готовую реализацию как в MySQL, так и в File.
Другими словами трейт позволяет добавлять реализацию в классы без необходимости копирования этой реализации руками. Другой пример, трейт SingletonTrait. Этот трейт может использоваться всеми классами, реализующими паттерн Singleton. Ведь у всех этих классов механизм получения одного единственного объекта один и тот же, вот он и выносится в трейт
Трейты, обычно, дополняют интерфейсы. Если ты используешь только трейты (без интерфейсов), возможно ты просто пытаешься разделить реализацию на части (зачем?). Если же ты используешь конкретный трейт только в одном классе и больше нигде, то следует удалить трейт, а реализацию добавить прямо в класс, так правильнее.
P.S. что у тебя в классе делают public свойства?
Если очень хочется понять, зачем нужны трейты и как их использовать, попробуй реализовать Singleton на PHP так, чтобы можно было определить класс-одиночку следующим образом:
class MyClass implements SingletonInterface{
use SingletonTrait;
...
}
и объясни, почему нельзя сделать тоже, но с помощью абстрактного класса?
Delphinum, я исправлял в классе свойства, а в трэйтах по другому не получится, только сеттеры и геттеры если мутить, а так они не доступны, или есть варианты как получить общие свойства при множественном использовании трейтов.
разделил, так как методов реально гора уже целая
Delphinum, попробую, трэйт нормально с абстракцией дружит
# Koenig (14.05.2015 / 18:22)
Delphinum, есть варианты как получить общие свойства при множественном использовании трейтов.
Вынести свойство в класс.
Если в классе очень много методов, значит этот класс надо разделить на несколько.
# Koenig (14.05.2015 / 18:24)
Delphinum, попробую, трэйт нормально с абстракцией дружит
Трейт то дружит, но абстракцию использовать в этой задаче нельзя. Почему нельзя?
Delphinum, двойной вызов?