On 10/04/02, "Andi Gutmans" <[EMAIL PROTECTED]> wrote:
> I'll sum up my proposal again.
> Support the following:
> class MyClass extends MyParent aggregates Timer, FooBar
> {
> }
> 
> $obj = new MyClass; // Creates $obj->Timer and $obj->FooBar
> $obj->method(); // Searches MyClass, MyParent if not found tries to call 
> the method on $obj->Timer followed by $obj->FooBar
> 
> If you want to access an aggregated object directly you can do:
> $obj->Timer->method();
> 
> Got to go to bed now ;)

I think we need just one more extra on top of this: some kind of
"as" operator.  Here's why:

class Timer {
  function Tick() { echo "Timer Tick"; }
}
class FooBar {
  function Tick() { echo "FooBar Tick"; }
}
class MyClass extends MyParent aggregates Timer, FooBar
{
}
$a = new FooBar();
$b = new MyClass();

function ExpectsFooBar($foo)
{
   $foo->Tick();
}

ExpectsFooBar($a); // outputs "FooBar Tick"
ExpectsFooBar($b); // outputs "Timer Tick" - incorrect
ExpectsFooBar($b->FooBar); // outputs "FooBar Tick"

So, should all code try looking for a member named after
the class whose method they want to call?  It won't always
work, and doesn't really convey what is going on.

ExpectsFooBar($b as FooBar);

This explicitly says what is going on.  It's operation
is simple: if $b is_a FooBar return $b, else if $b has_a FooBar,
return $b->FooBar.

--Wez.


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

Reply via email to