@WesNetmo @ Twitter

@WesNetmo @ Twitter


PHP RFC: Allow abstract function override


PHP 7 introduced type declarations for return and improved ones for parameters. They currently support a very limited kind of variance (only to no-type):

class A           { function bar(stdClass $x){}  }
class B extends A { function bar($x): stdClass{} }

However, this isn't currently matched by the equivalent abstract declarations:

abstract class A           { abstract function bar(stdClass $x);  }
abstract class B extends A { abstract function bar($x): stdClass; }
class C extends B          { function bar($x): stdClass{} }
// Fatal error: Can't inherit abstract function A::bar()
// (previously declared abstract in B)

This RFC proposes to allow this, even if it has very few uses, and because there is no reason to disallow a compatible redefinition.

Additionally, it comes in handy for documentation:

interface A{
    function doSomething();
interface B extends A{
    function doSomethingElse();
abstract class AProxy implements A{
    abstract protected function getOrigin(): A;
    function doSomething(){
        return $this->getOrigin()->doSomething();
// This phpdoc syntax has quirks in phpdocumentor
// apigen and phpstorm, and it's almost unmanageable
// as phpdoc interpreters have poor multiline support
// (imagine documenting all the parameters, the return
// type, all the throws...):
/** @method B getOrigin() */
abstract class BProxy extends AProxy implements B{
    /** @return B */ // This is much better!
    abstract protected function getOrigin(): A;
    function doSomethingElse(){
        return $this->getOrigin()->doSomethingElse();

And, obviously, it will gain more uses when PHP will support a full-featured type variance.

Backward Incompatible Changes


Proposed PHP Version(s)


Patches and Tests

Pull request to handle the change: https://github.com/php/php-src/pull/2531



An option needs 2/3 votes to win

Accept abstract function override? (84.2% approved)
User Vote
ashnazg No
bwoebi Yes
cyberline Yes
daverandom Yes
dm Yes
emir Yes
galvao Yes
kelunik Yes
kguest Yes
marcio Yes
mariano No
ocramius Yes
patrickallaert No
salathe Yes
sammyk Yes
stas Yes
subjective Yes
treffynnon Yes
trowski Yes