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! -- Ferenc Kovács @Tyr43l - http://tyrael.hu