On Wed, Feb 17, 2016 at 12:48 PM, Kevin Gessner <kgess...@etsy.com> wrote:
> On Wed, Feb 17, 2016 at 10:26 AM, Levi Morrison <le...@php.net> wrote:
>>
>> I want to add my personal experience with traits: every time I create
>> a trait it is to implement an interface. Here is a publicly available
>> [example with
>> OuterIterator](https://github.com/morrisonlevi/Ardent/blob/master/src/Collection/OuterIteratorTrait.php):
>>
>> [snip]
>>
>> I can see how it would be nice to allow the trait to officially
>> declare that it implements some interface (in this case Iterator or
>> OuterIterator) which would require that the trait has fully
>> implemented the required methods (or declared them as abstract). This
>> would be a small improvement but helpful.
>>
>> I am less certain about the classes which `use` it automatically
>> inheriting the interfaces. To clarify: I am neither in favor or
>> against that part. Or at least at this stage, anyway.
>
>
> I don't think there is enough benefit from allowing traits to declare
> interfaces, but not propagating the interface out to classes that insert the
> trait.  It does provide an extra bit of enforcement on the trait's methods,
> but the real value is in making that contract a part of the classes.

I do agree that there is only a little benefit but I disagree that it
is "not enough". It's a quality of life change to an existing feature
that has no impact outside of that feature – sounds perfect to me.

> In what situation would a class that inserts OuterIterator not want to
> declare the Iterator class?  If every class that inserts the trait would
> also declare Iterator, it's needless repetition to require that both the
> class and the interface.

Funny you should ask, because OuterIteratorTrait implementing
OuterIterator is actually a case where not all using classes will want
to be OuterIterators formally (just get the horizontal code reuse).
This is because I don't want to "leak" the inner iterator because it
is suppose to be abstracted. In these cases I use the syntax for using
a trait method under a different visibility.

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to