Search code examples
phpinheritancephpstormphp-7late-static-binding

Return type "self" in abstract PHP class


Trying to make an abstract class to partially implement functionality of its' child classes and force a contract upon them required for this implementation, I use the following construct:

abstract class Parent {

    public static function fromDB(string $name = '') {
        $instance = new static();
        if (!empty($name)) {
            $instance->setName($name)->read();
        }
        return $instance;
    }

    public abstract function read();

    public abstract function setName(string $name): self;

}

Here PHP seems to understand that setName($name) returns an Object of type Parent, but PhpStorm indicates that read() can not be called on the result, which would have been the expected result.

Error Message: Referenced Method is not found in subject class.

I do not understand why this happens, and even suspect a bug in PHP or PhpStorm.

I've read up on Late static binding and the following questions which partially talk about this problem, but I couldn't figure out how to fix it:

Thank you for your time and help.

I'm trying to implement setName in child classes in a way so it is clear that the type of the returned Object is the one of the child:

public function setName(string $name = null): user {...}

which doesn't work with self return type and static is forbidden.


Solution

  • Your code sample looks fine in PhpStorm 2017.2 (currently in EAP stage) but shows warning in 2017.1.4.

    enter image description here

    Quite possibly it was fixed by WI-33991 or one of the related tickets.


    You may get & try the 2017.2 EAP build at any time from here: http://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Early+Access+Program

    It comes with own 30-days license and can run in parallel to your current version (IDE-wide settings are stored in separate folders).