On Wed, 2002-04-10 at 22:58, Andi Gutmans wrote:
> I still prefer to keep PHP a relatively easy to learn, simple yet powerful 
> language.
> I think this is a huge overkill and prefer going with something like I 
> proposed.
> Anyway the inheritance debates have been going on for years and I doubt 
> we'll solve all possible scenarios for the first time in programming 
> language history. Also historically the languages which do try and solve 
> lots of scenarios end up having extremely complex mechanisms to do so.
> 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

In my head there was always a method_name => object hash in the
aggregating object, but then you can't deal with an aggregated object
aggregating another object.  Search every time it must be.

> If you want to access an aggregated object directly you can do:
> $obj->Timer->method();

Actually, even if class != type in PHP, I think Wez's suggestion is a
better way of expressing this:

($obj as Timer)->method();

However, your $obj->Timer->method() can be implemented with overloading,
so it would make the implementation less complex.

There's one important thing missing in your suggestion though: the
runtime aggregate() function.  We also need aggregate_info($this) for
listing aggregated classes, deaggregate($this, "class") and
serialization support (you mentioned that didn't you?)

Some issues I thought of that need to be resolved:

* Which methods should be skipped?  IMHO it makes sense to skip
ZE1-style constructors and methods starting with at least one
underscore.  Those starting with two underscores are reserved, while it
is common practice to use one underscore for "declaring" a method as
private.

* Should it be possible to have multi-level aggregation?

class a aggregates b {}
class b aggregates c {}
class c { function foo() {} }

$a = new a;
$a->foo();

IMHO, the only sensible thing would be for this to call c::foo(), or
else objects would get different interfaces in different contexts.

* Dealing with possible loops:

class a aggregates b {}
class b aggregates a {}

$a = new a;
$a->unknown_method();

Should it be illegal to "loop-aggregate" classes, or should it be
detected at runtime?  I'm not sure.

 - Stig


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

Reply via email to