Hello Hans, Tuesday, February 17, 2004, 2:59:26 PM, you wrote:
> Andi Gutmans wrote: >> It depends what you call different signature. If you are talking about >> default arguments, we should consider allowing those as they don't >> change the isA relationship. However, if you want us to allow >> inheriting interfaces which truly differ in function prototypes than >> that would definitely be a strong no. You can never break the isA >> relationship. > I think at the heart of the problem (well, my problem) is the fact that > using interfaces is restricting the way that classes are allowed to > inherit from other classes. > -- Example (1) -- > In more traditional PHP this works fine: > class A { > function init() { ... } > function doSomething($arg1, $arg2) { ... } > } > class B extends A { > function doSomething($arg1, $arg2, $arg3, $arg4 = null) { ... } > function doSomethingElse($arg1) { ... } > } > $obj = new B; > // $obj instanceof B : YES > // $obj instanceof A : YES -- but misleading > -- Example (2) -- > Now when you throw interfaces into the mix, I won't be able to do that > anymore -- even if I use two separate interfaces for class A and class B. > interface IA { > function init(); > function doSomething($arg1,$arg2); > } > interface IB { > funciton init(); > function doSomething($arg1, $arg2, $arg3, $arg4 = null); > function doSomethingElse($arg1); > } > class A implements IA { > // same class body as above > } > class B extends A implements IB { > // same class body as above > } > Now I get fatal errors, because class B is inheriting functionality from > A that is required by the interface IB. Actually, I think what is > happening (can someone confirm this?) is that class B is being forced to > implement both IA and IB, and because interfaces (unlike classes) are > not allowed to override methods class B cannot implement both interfaces. No the problem is that doSomething() cannot have more than one origin. > Posslble solutions to this (in PHP engine): > - do not inherit interfaces: force "implements" to be explicit for > each class, so that in this case class B would not implement interface > IA. This doesn't seem like a particularly good solution, but it would > work [I think]. > - allow interfaces to override methods. I think to be consistent > with PHP class behavior this is still the best option. Just like PHP > classes can override methods, I think interfaces should be allowed. > It's just as easy to break "instanceof" using class inheritance (as I > showed in Example 1) as it would be to break it using interface > overrides. In Java this isn't an issue of course because of overloading. > Does anyone have any other suggestions for this? I agree that radically > breaking signatures in subclasses is probably not "good practice" but in > light of the fact that PHP doesn't support method overloading, I don't > really see an alternative. My take on it is that this is just a > limitation of PHP -- and I'm fine with that. I think to be consistent > it would be good if interfaces supported the same behavior -- again, > agreeing all the while that academically it's not the "best" design. You can still emulate that by doing your typechecking inside the function if you really need that - here again PHP choose the easy way. The way which people can easily understand. We don't want to have a second Java or C++. -- Best regards, Marcus mailto:[EMAIL PROTECTED] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php