Hi,
On 24 Mar 2010, at 11:50, Lukas Kahwe Smith wrote:
> "In case of the above definition of Talker, PHP will show a warning that
> there have been conflicts and name the methods smallTalk() and bigTalk() as
> the reason of this conflict. Therefore, neither of the given implementations
> will be available in the class."
>
> I think this is a fundamental decision, should it be a warning or a fatal
> error? Generally I prefer PHP to keep on going whenever it can. I guess in
> most cases if we stick to a warning the user will end up with a fatal error
> anyway, but it might not be so clear why the given method is unavailable. But
> there should still be a warning, which I guess cannot be suppressed all that
> easily.
Well, I do not like a fatal errors. This problem does not leave the engine in
an undefined state, and personally, I think, fatals should only be caused by
something which really cannot be handled.
Since we have __call, there might even be something executable.
>
> (@Stefan: didnt want to start editing minor typo's in the RFC ..
> s/waring/warning .. that typo can be found in other places too)
Thanks, fixed that.
> "The introduction of a new name is not renaming and references in methods to
> a given method name aren't changed either."
> The third sentence is not so clear to me, but if I guess it its also just a
> typo as it makes more sense to me when replacing "renaming" to "result in
> renaming". But maybe you could tweak that paragraph to be a bit clearer. For
> example its still not totally clear to me why aliasing doesn't imply
> inclusion, I guess its definitely more flexible. How will things work when
> traits have overlapping method names when other methods of the given traits
> call these overlapping methods?
I have not changed that paragraph, but I added a discussion section about
renaming, and linked to it.
>
> trait A {
> public function smallTalk() {
> $this->bigTalk();
> }
>
> public function bigTalk() {
> echo 'A';
> }
> }
>
> trait B {
> public function smallTalk() {
> $this->bigTalk();
> }
>
> public function bigTalk() {
> echo 'B';
> }
> }
>
> class Talker {
> use A, B {
> B::smallTalk instead A;
> A::bigTalk instead B;
> B::smallTalk as talk;
> }
> }
>
> What is there anyway to ensure that when Talker::talk() is called that
> B::bigTalk() is still called and not A::bigTalk() because I want to maintain
> the "integrity" of each trait? Is that what you mean with its "not renaming
> and references in methods to a given method name aren't changed either" as in
> it will indeed call B::bigTalk()? Reading further long I however see that
> "This leads to missing features like recursion for methods introduced by
> aliases." Also I guess exactly this is the key difference to Grafts.
Yes, that is the key difference.
Traits are meant to be light-weight and composeable. This includes, that I see
it as a feature, that Traits can call methods of other Traits.
> Reading further about Grafts, I must say I really like that approach. I mean
> we have talked about traits for quite a bit already, but I feel like I got
> how Grafts work the first time reading. I also like the fact that since
> Grafts are just classes, people can integrate them as they see fit, like they
> can use delegation if they are still on an older version of PHP or use
> Grafts. I also envision that there will be less surprises when using Grafts
> and this fits well with the approach to keeping the barrier to entry low for
> PHP development.
Well, how do we reach a conclusion on that whole topic?
With a poll?
Best regards
Stefan
--
Stefan Marr
Software Languages Lab
Vrije Universiteit Brussel
Pleinlaan 2 / B-1050 Brussels / Belgium
http://soft.vub.ac.be/~smarr
Phone: +32 2 629 2974
Fax: +32 2 629 3525
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php