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:
---
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