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