|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-03-03 09:57 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Dec 04 01:00:01 2025 UTC |
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()); ?>