Bug #73220 [Com]: Classes implementing an interface can violate its method's signatures
[email protected] ("bradyn at bradynpoulsen dot com") Sun, 2 Oct 2016 06:12:11 GMT
| Newsgroups | php.standards |
|---|---|
| Message-ID | <[email protected]> |
Edit report at https://bugs.php.net/bug.php?id=73220&edit=1
ID: 73220
Comment by: bradyn at bradynpoulsen dot com
Reported by: phansys at gmail dot com
Summary: Classes implementing an interface can violate its
method's signatures
Status: Not a bug
Type: Bug
Package: PHP Language Specification
Operating System: any
PHP Version: 7.0.11
Block user comment: N
Private report: N
New Comment:
Adding another optional parameter is totally allowed by LSP. As long as the implementing class allows you to call `test()` or `test('someValue')` as specified by the interface, the class is honoring the method signature.
However, if class B were defined as:
class B implements A
{
public function test($one = null, $two)
{
var_dump($one, $two);
}
}
it would then be violating the signature in requiring the 2nd parameter to be passed. As such, you would receive the expected result mentioned above.
Previous Comments:
------------------------------------------------------------------------
[2016-10-01 21:50:49] [email protected]
Adding additional default values does not violate LSP (Liskov Substitution Principle) in that in your example, B can be used in place of any other class that implements A and as such it is entirely compatible with A and there should be no error.
------------------------------------------------------------------------
[2016-10-01 19:53:14] phansys at gmail dot com
Description:
------------
Classes implementing an interface can violate its method's signatures by adding more arguments with a default value.
Test script:
---------------
interface A
{
public function test($one = null);
}
class B implements A
{
public function test($one = null, $two = null)
{
var_dump($one, $two);
}
}
Expected result:
----------------
Fatal error: Declaration of B::test($one, $two) must be compatible with A::test($one = NULL)
Actual result:
--------------
No error.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=73220&edit=1