构建流体界面时的类型转换问题

Type-casting problem while building fluid interface

例如我们有下面的摘要class

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

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

当你尝试像这样使用它时

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

那么在setParam之后我们只会看到setParam方法,因为setParam returns AbstractClass。我试图用 PHP-doc @return selfAbsractClass 中标记 setParam,但它不起作用。

这个问题有什么解决办法吗?

要解决这个问题你可以使用@return static PHP-doc属性

<?php

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

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

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

此示例中的所有内容都将正确突出显示。