Проблема литья типов при создании интерфейса жидкости - PullRequest
0 голосов
/ 04 декабря 2018

Например, у нас есть следующий абстрактный класс

<?php
    class AbstractClass {
        public function setParam(): AbstractClass {}
    }

    class ConcreteClass extends AbstractClass {
        public function test():void {}
    }

Когда вы попытаетесь использовать его следующим образом

<?php
(new ConcreteClass())->setParam()->test();

Тогда после setParam мы увидим только setParam метод, потому что setParam возвращает AbstractClass.Я пытался пометить setParam внутри AbsractClass с помощью PHP-doc @return self, но он не работает.

Есть ли какие-либо решения этой проблемы?

1 Ответ

0 голосов
/ 04 декабря 2018

Для решения этой проблемы вы можете использовать @return static PHP-doc attribute

<?php

class A {
   /** @return static */
   public function methodA(): A;
}

class B {
   /** @return static */
   public function methodB(): B;
}

(new B())->methodB()->methodA()->methodB();

Все в этом примере будет выделено правильно.

...