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