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