ID: 36601 Updated by: [EMAIL PROTECTED] Reported By: webmaster at domiwitt dot de Status: Wont fix Bug Type: Class/Object related -Operating System: Win XP Professional +Operating System: * -PHP Version: 5.1.2 +PHP Version: 5.* New Comment:
Even if we were allowing to change the typehint in the derived class' method we would allow to specify a specialized type but a generalized type because we still would need to take inheritance rules into account. Previous Comments: ------------------------------------------------------------------------ [2006-03-03 10:16:22] webmaster at domiwitt dot de Now I know that this will not get fixed but I made a mistake in the coding example above. So this is just to state my original intention: <?php interface ISpecification { public static function isSpecifiedBy($object); } class FooSpecification implements ISpecification { public static function isSpecifiedBy(Foo $object) { echo get_class($object); } } class BarSpecification implements ISpecification { public static function isSpecifiedBy(Bar $object) { echo get_class($object); } } class Foo { } class Bar extends Foo { } FooSpecification::isSpecifiedBy(new Foo()); BarSpecification::isSpecifiedBy(new Bar()); ?> ------------------------------------------------------------------------ [2006-03-03 09:59:21] [EMAIL PROTECTED] We discussed this in the PDM, see: http://www.php.net/~derick/meeting-notes.html#implement-inheritance-rules-for-type-hints ------------------------------------------------------------------------ [2006-03-03 09:57:10] webmaster at domiwitt dot de Description: ------------ On an inherited methods that uses parameter type hints it is not possible to specialize a type hint. By "specialize" I mean that the type hint on the inheriting class's method is able to type check an inherited class of the previous type hint. I have found several cases, where this behaviour would be extemely useful. The Specification Pattern poses a good example. Certainly you can work around it by not using type hints and do some "instanceof" or "get_class()" checking inside, throwing an exception in unwanted cases. It would however be nice if the language itself could support such a behaviour. Reproduce code: --------------- <?php interface ISpecification { public static function isSpecifiedBy($object); } class FooSpecification implements ISpecification { public static function isSpecifiedBy($object) { echo get_class($object); } } class BarSpecification implements ISpecification { public static function isSpecifiedBy($object) { echo get_class($object); } } class Foo { } class Bar extends Foo { } FooSpecification::isSpecifiedBy(new Foo()); BarSpecification::isSpecifiedBy(new Bar()); ?> Expected result: ---------------- For this not to throw a compile time error Actual result: -------------- Fatal error: Access level to FooSpecification::isSpecifiedBy() must be public (as in class ISpecification) in [...] on line 9 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=36601&edit=1