Pull to refresh

Comments 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. Всё. В чем конфликт?
Конфликт в том, что в таком случае нельзя будет переименовывать методы трейта и комбинировать одноимённые методы из разных трейтов. А сейчас такая возможность есть.
Почему же, можно, пока класс реализует интерфейс трейта.
зашел сюда увидеть этот комментарий.
UFO landed and left these words here
Для этого достаточно описать интерфейс отдельно от трейта и реализовывать его в классах, которые используют трейт.
Sign up to leave a comment.

Articles