Edit report at https://bugs.php.net/bug.php?id=37854&edit=1
ID: 37854 Comment by: worldoffame at hotmail dot com Reported by: spam at codeword dot net Summary: Type Hinting with derived classes and interfaces not working Status: Not a bug Type: Bug Package: Class/Object related Operating System: * PHP Version: * Block user comment: N Private report: N New Comment: Well this is indeed a bug, how can you say it is not just because you think it is not? Although changing typehinting should be disallowed for completely irrelevant classes, but narrowing down the scope of typehinting(changing from superclass/interface to subclasses) is generally enabled in most OO languages. Funny you are telling the bug reporter to learn inheritance, just by judging from that test example he/she wrote? Just like the last comment says, the current way PHP does is clearly violating Liskov Substitution Principle. There are so many things that work in other OO languages that do not work in PHP. Okay PHP is not java, but its not just java, its all the OO languages you can think of. Previous Comments: ------------------------------------------------------------------------ [2012-04-20 10:39:54] kabanovdmitry at gmail dot com Why then does PHP allow to narrow argument's type in subclass which extends base class? This seems odd, because this violates Liskov Substitution Principle. ------------------------------------------------------------------------ [2006-06-19 22:21:23] he...@php.net Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php First we don't allow changesin the typhints in derived classes/implementing classes. Second you need to learn inheritance rules again. Your code would break is-a relation. ------------------------------------------------------------------------ [2006-06-19 22:11:34] spam at codeword dot net Description: ------------ When adding type hinting to an interface then implementing that interface using a derived class, the script compiler does not seem to recognise that the implemented type hint is derived from the interfaces type hint. I hope that makes sense. The code below may be more clear. Reproduce code: --------------- <?php interface MyInterface{public function test(ClassA $object);} class MyClass implements myInterface{ public function test(ClassB $object){// should work but does not echo $object->x; } } class ClassA {public$x = "Class is ClassA"; } class ClassB extends ClassA{ public $x = "Class is ClassB";} $myclass = new MyClass; $a = new ClassA; $b = new ClassB; $myclass->test($b); $myclass->test($a); ?> Expected result: ---------------- Class is ClassB Fatal error: Argument 1 passed to MyClass::test() must be an instance of ClassB, called in typeHintTest.php on line 14 and defined in typeHintTest.php on line 4 Actual result: -------------- Fatal error: Declaration of MyClass::test() must be compatible with that of MyInterface::test() in typeHintTest.php on line 3 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=37854&edit=1