Bug #73220 [Com]: Classes implementing an interface can violate its method's signatures

From: Date: Sun, 02 Oct 2016 13:16:05 +0000
Subject: Bug #73220 [Com]: Classes implementing an interface can violate its method's signatures
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-204405@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=73220&edit=1

 ID:                 73220
 Comment by:         phansys at gmail 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:            Scripting Engine problem
 Operating System:   any
 PHP Version:        7.0.11
 Block user comment: N
 Private report:     N

 New Comment:

So, should I create another bug report for Object Interfaces documentation? 
http://php.net/manual/en/language.oop5.interfaces.php#language.oop5.interfaces

It states in a note:

"The class implementing the interface must use the exact same method signatures as are defined
in the interface. Not doing so will result in a fatal error."

Which doesn't seem to mention LS principle in any way.


Previous Comments:
------------------------------------------------------------------------
[2016-10-02 06:12:09] bradyn at bradynpoulsen dot com

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.

------------------------------------------------------------------------
[2016-10-01 21:50:49] rasmus@php.net

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


Thread (1 message)

  • phansys at gmail dot com
  • Unknown Message
    • phansys at gmail dot com
« previous php.bugs (#204405) next »