Открыть список
Как стать автором
Обновить

Комментарии 17

Для полной картины не хватает только ORMBehaviors\ActiveRecord :)
Впрочем, никто не спорит, что трейты это вкусняшка.
Главное — четко понимать, что трейты это миксины, а не полноценное множественное наследование.
Трейты это не миксины. Это легализированный копипаст =)

Что жаль, что трейты не связанные с интерфейсом. Т.е. нельзя проверить, например, включен ли в класс тот или иной трейт по интерфейсу. А это было бы очень даже неплохо.
Вообще-то, проверить можно, есть функция get_declared_traits
Если так, то скорее class_uses

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

Кроме того, существенное ограничение: This function returns an array with the names of the traits that the given class uses. This does however not include any traits used by a parent class.
>> По сути, интерфейсы и трейты решают одну и ту же проблему…
По сути, совсем разные. Интерфейс описывает возможности класса, а трейт — их реализацию. Используя реализацию трейта в классе, вы можете переименовывать его методы или использовать только некоторые из них, таким образом, использование трейта классом никоим образом не гарантирует то, что класс будет реализовывать какой-то интерфейс.
имеется ввиду что-то типа.
trait Timestampable implements Timestampable {
  function setCreatedAt();
  function setUpdatedAt();         
}


Пусть использование интерфейса будет опционально. Но было бы неплохо, если бы он был.
Просто хотелось бы адекватно реагировать в зависимости от того какой модуль подгружен.
class Order implements TimestampableInterface
{
    use TimestampableTrait;
}

if ($object instanceof TimestampableInterface) {
    // here you go
}


Посмотрите это и это, и поймёте, о чём я говорил в предыдущем комментарии.
Да, я смотрел. Но это не объясняет почему нет возможности привязывать интерфейс к трейтам. А прописывать для каждого трейта его же интерфейс, это немного напряжно: нужно знать какой интерфейс он реализует, и потом знать как это в коде проверить.

Короче, пока что это всё не принципиально. Просто трейты + интерфейсы были бы отличной независимой связкой кода с огромными возможностями.
Почему не объясняет?
Как это объясняет?
Класс должен реализовать интерфейс. Интерфейс передан с трейтом командой use. Всё. В чем конфликт?
Конфликт в том, что в таком случае нельзя будет переименовывать методы трейта и комбинировать одноимённые методы из разных трейтов. А сейчас такая возможность есть.
Почему же, можно, пока класс реализует интерфейс трейта.
зашел сюда увидеть этот комментарий.
Увидели? Давайте обратно :)
НЛО прилетело и опубликовало эту надпись здесь
Для этого достаточно описать интерфейс отдельно от трейта и реализовывать его в классах, которые используют трейт.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.