【问题标题】:Type-casting problem while building fluid interface构建流体界面时的类型转换问题
【发布时间】:2018-12-04 15:44:54
【问题描述】:

例如我们有如下抽象类

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

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

当你尝试像这样使用它时

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

然后在setParam 之后我们将只看到setParam 方法,因为setParam 返回AbstractClass。我尝试使用 PHP-doc @return selfAbsractClass 中标记 setParam,但它不起作用。

这个问题有解决办法吗?

【问题讨论】:

  • @NigelRen 我只是把代码写得尽可能小。在完整代码中,setParam 内部有return $this,您可以看到setParam 方法的返回类型是AbstractClass。这段代码运行良好,但 IDEA 在 setParam 之后看不到 test 方法,因为 setParam 返回 AbstractClass,IDE 仅帮助您使用来自 AbstractClass 的方法。
  • 这个问题不清楚IDE中的问题,您使用的是哪一个?
  • @NigelRen 我正在使用 JetBrains PHPStorm

标签: php design-patterns casting phpstorm intellisense


【解决方案1】:

要解决这个问题,你可以使用@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();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多