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;
}


$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.

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

Reply via email to