Bug #72496 [Ver->Csd]: Cannot declare public method with signature incompatible with parent private me

From: Date: Tue, 05 Jul 2016 12:39:17 +0000
Subject: Bug #72496 [Ver->Csd]: Cannot declare public method with signature incompatible with parent private me
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-202066@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72496&edit=1

 ID:                 72496
 Updated by:         nikic@php.net
 Reported by:        postmaster at greg0ire dot fr
 Summary:            Cannot declare public method with signature
                     incompatible with parent private me
-Status:             Verified
+Status:             Closed
 Type:               Bug
 Package:            Class/Object related
 Operating System:   Linux
 PHP Version:        5.5.37
-Assigned To:        
+Assigned To:        nikic
 Block user comment: N
 Private report:     N

 New Comment:

Fix landed as https://github.com/php/php-src/commit/08777e9615868cf2acf4dc2a86a7ef21106beddd
in 5.6 and upwards.


Previous Comments:
------------------------------------------------------------------------
[2016-07-03 21:30:29] mail at pmmaga dot net

Added a second PR. This time, against 5.6

------------------------------------------------------------------------
[2016-06-30 08:48:42] mail at pmmaga dot net

Added a pull request against 5.5. I also have the fix for master. Should I create a different PR for
it?

------------------------------------------------------------------------
[2016-06-28 12:52:53] postmaster at greg0ire dot fr

> Right. LSP should not be enforced when overriding private methods.

Clearly. As a side note, this only happens if the method in the child class is public or protected.

------------------------------------------------------------------------
[2016-06-28 11:23:59] nikic@php.net

Right. LSP should not be enforced when overriding private methods.

------------------------------------------------------------------------
[2016-06-26 17:18:04] postmaster at greg0ire dot fr

Description:
------------
When declaring a public method in a child class, one can't reuse the name of a private method
of the parent without being issued a Warning for php 7, a Strict Standards error for php 5.5 - 5.6,
unless the signature is considered compatible.

Test script:
---------------
<?php

class Foo
{
    private function getName()
    {
        return 'John';
    }
}

class Bar extends Foo
{
    public function getName($extraArgument)
    {
        return $extraArgument;
    }
}

Demonstration : https://3v4l.org/SNlDO

Expected result:
----------------
The parent method is private : it can't be called from the outside and as far as the child
class is concerned, it does not exist. Creating a public method with the same name is not overriding
the method since methods in the parent class will still call the private method when asked to.

Actual result:
--------------
php 7.7 : Warning: Declaration of Bar::getName($extraArgument) should be compatible with
Foo::getName() in /in/SNlDO on line 17

5.5.0 - 5.6.22 : Strict Standards: Declaration of Bar::getName() should be compatible with
Foo::getName() in /in/SNlDO on line 17


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=72496&edit=1


Thread (6 messages)

« previous php.bugs (#202066) next »