On Mon, Oct 17, 2011 at 8:19 PM, Ferenc Kovacs <tyr...@gmail.com> wrote:

>
>
> On Mon, Oct 17, 2011 at 8:00 PM, Stefan Marr <p...@stefan-marr.de> wrote:
>
>> Hi Ferenc:
>>
>> On 17 Oct 2011, at 19:41, Ferenc Kovacs wrote:
>>
>> > Hi Stefan,
>> >
>> > Multiple people asked me that how they can expect/check that a given
>> object uses a trait or not.
>> > Of course one could write the concrete methods as a trait and always use
>> a given interface for typehints, but I can't see why shouldn't instanceof
>> and typehints in general work for traits.
>> > Is the any technical or maybe theoretical argument against this?
>>
>> Originally I proposed traits including the semantics that traits directly
>> implement interfaces.
>>
>> The discussion is somewhere here:
>> http://www.mail-archive.com/internals@lists.php.net/msg33935.html
>>
>> I think Sebastian was the person with the strongest opinion on that
>> particular issue:
>>   http://www.mail-archive.com/internals@lists.php.net/msg33948.html
>>
>> And I tend to agree with him.
>>
>> Currently I think along the following lines:
>>
>>  A trait is not a full unit of reuse!
>>  A class is.
>>  Don't use traits where you should use classes and composition.
>>  Traits do not guarantee anything, if you want to be sure your invariants
>> hold, use classes and composition.
>>
>>  Traits allow to reuse behavior in a much more flexible way, but they do
>> not replace classes.
>>
>> And, well, then there is this:
>> https://wiki.php.net/rfc/horizontalreuse#requiring_composing_class_to_implement_interface
>>
>> That should make sure that people can use interfaces for the purpose
>> envisioned here.
>>
>> For reference, there is also: https://bugs.php.net/bug.php?id=55613
>>
>>
>> But aside of the things I said before:
>>  - theoretically: keeping interfaces and traits apart is a good, clean
>> language design decision.
>>  - practically: people LOVE ugly languages, because they get things done
>>
>> So, well, I can't claim anything about value here.
>> The current situation might be more friendly to the teacher.
>> Another design might offer more freedom/power...
>
>
> Thanks for the clarification.
> Without either having the ability to check a trait or implement an
> interface for a trait, or at least implementing the require syntax, I think
> that it isn't really a non-fragile solution for my question.
> AFAIK the only solution available currently is something like:
>
> <?php
> interface testTraitInterface{
>
> }
>
> trait testTrait{
>
> }
>
> class testClass implements testTraitInterface{
> use testTrait;
> }
>
> $tc = new testClass;
> var_dump($tc instanceof testTraitInterface);
>
>
> Which is pretty weak of a solution, however if we only thinks traits as a
> macro, this is enough, but then why bother with the as and insteadof, traits
> composed traits and such?
> I think we will have much more feedback with the release of 5.4, so maybe
> we can re-consider extending the implementation for the next version.
> And I agree that it is the best to only release what we are confident in,
> and I'm happy that we waited a version for correctly implementing Closures
> for objects.
>
> Thanks again for the clarification and for your work on traits!
>

Jeff Carouth pointed out(
https://twitter.com/#!/jcarouth/status/126030715514138624) that we have
class_uses() (https://bugs.php.net/bug.php?id=55266), would be nice having
that in the documentation.

-- 
Ferenc Kovács
@Tyr43l - http://tyrael.hu

Reply via email to