On Fri, Feb 22, 2008 at 10:32 AM, David Coallier <[EMAIL PROTECTED]> wrote:
>
> On Fri, Feb 22, 2008 at 10:03 AM, Lukas Kahwe Smith <[EMAIL PROTECTED]> wrote:
>  >
>  >  On 22.02.2008, at 15:45, Gregory Beaver wrote:
>  >
>  >  > Marcus Boerger wrote:
>  >  >> Hello Lukas,
>  >  >>
>  >  >>  alright,
>  >  >>
>  >  >>   'foo as bar' is ok to me and does not even add a new keyword.
>  >  >> Ignore or any more keywords are bad and I also think that the correct
>  >  >> would be hide(ing). But as I further more explained it should
>  >  >> really be
>  >  >> something that only marks a method as private if at all. That can be
>  >  >> done as:
>  >  >>   'foo as private' since private is a keyword it cannot conflice
>  >  >> anyway.
>  >  >
>  >  > I like this solution.
>  >
>  >  Yes to me it seems like we can solve the entire "lack of
>  >  encapsulation" through aliasing/hiding by making the following changes
>  >  to the original proposal:
>  >
>  >  A trait may contain methods and properties. When importing a trait
>  >  into a class, all methods and properties are imported in a way that
>  >  makes them only visible within the trait (I dont like the use of
>  >  "private" here .. its what confused me in the first proposals of this
>  >  approach by Marcus/Andi). The user of the trait can however explicitly
>  >  make properties and methods from the trait visible to the class
>  >  importing the trait. Also the trait using class can explicitly say
>  >  that it wants to override a method/property in the scope of the trait.
>  >
>  >  This way:
>  >  1) there is little chance of accidentally breaking a trait
>  >  2) changes within the trait should not break anything in the trait
>  >  using class, unless the developer explicitly messed with the traits
>  >  internals in the class using the trait. in that case however he can
>  >  quickly spot the potentially problematic lines
>  >
>  >
>  >  > I have been uncomfortable with the current trait suggestions because
>  >  > they occur in the body of the class, whereas extends/implements is
>  >  > outside.  I think there is a way to handle this, however.
>  >
>  >  I dont agree here. traits are different. They do not affect "what" the
>  >  class is. They change what it can do and as such the stuff should be
>  >  defined next to properties and methods.
>  >
>  > >
>  >
>  >  > <?php
>  >  >
>  >  > trait trait1 { function a(){}}
>  >  > trait trait2 { function a(){}}
>  >  > class Blah extends ... implements ... traits trait1, trait2, trait3 {
>  >  > }
>  >  > ?>
>  >
>  >  Here it gets worse. Now if I refactor things into a trait, I have to
>  >  start changing all uses of those methods.
>  >
>  >  @Greg: I think you are going in the wrong direction here.
>  >
>
>  Fun that you mentionned that structure greg because I was thinking of
>  something along those lines. Something very similar actually but the
>  aliasing could look like this:
>
>  trait One {
>     function name() { return __TRAIT__; }
>     function removeMe() {}
>  }
>
>  trait Two {
>     function name() { return __TRAIT__; }
>  }
>
>  class Reel traits One, Two
>  {
>     override One::name with Two::name;
>     remove Two::removeMe;

It is of course

       remove One::removeMe;

>  }
>
>
>  $object = new Reel();
>  echo $object->name();  // Echos "Two" of course.
>
>
>  I find that rather clean and clear that you we are either overriding
>  what with what and then removing a method. But as lukas mentionned, we
>  may be stepping out of line here...
>
>
>
>  >  regards,
>  >  Lukas
>  >
>  >
>  >
>  >  --
>  >  PHP Internals - PHP Runtime Development Mailing List
>  >  To unsubscribe, visit: http://www.php.net/unsub.php
>  >
>  >
>
>
>
>  --
>  David,
>  Re-read what you are replying.
>



-- 
David,
Re-read what you are replying.

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

Reply via email to