【问题标题】:DocBlock class type inheritanceDocBlock 类类型继承
【发布时间】:2012-09-11 21:07:24
【问题描述】:

虽然这个问题一般是关于 DocBlocks,但我的用例是关于 PHP。

考虑以下 PHP 代码:

<?php

class ParentClass {
    /**
     * Says 'hi' to the world.
     * @return ParentClass Returns itself for chaining.
     */
    public function say_hi(){
        echo 'hi';
        return $this;
    }
}

class ChildClass extends ParentClass {
    /**
     * Says 'bye' to the world.
     * @return ChildClass Returns itself for chaining.
     */
    public function say_bye(){
        echo 'bye';
        return $this;
    }
}

$c = new ChildClass;
$c->say_hi()->say_b| <- type hinting won't suggest "say_bye" here

?>

这只是一个带有一些链接的普通类。扩展类失去了类型提示,因为父类的 docblock 正在使用一个特定的类名,该类名没有子类的方法/属性。

假设我们确实想要类型提示功能,(如果没有,请留下这个问题 - 我不想要无用的参数),我应该如何解决这个问题?

我想出了以下几种可能性:

  • 更改 PHPDoc 标准以允许使用特殊关键字
  • 添加一个多余的 say_hi() 方法,它调用父级只是为了重新声明 docblock
  • 根本不指定返回类型,让 IDE 决定return $this; 的含义(这甚至可以工作吗?)

【问题讨论】:

    标签: php javadoc phpdoc docblocks


    【解决方案1】:

    你可以这样解决:

    class ParentClass {
        /**
         * Says 'hi' to the world.
         * @return static
         */
        public function say_hi(){
            echo 'hi';
            return $this;
        }
    }
    

    “@return static”语句完全可以满足您的需求,PhpStorm 可以很好地使用它。

    【讨论】:

      【解决方案2】:

      您所描述的通常称为“流利的接口”,对象的所有方法都在其中完成工作并返回对象本身。

      我个人还没有看到任何关于如何做到这一点的最终确定的 PHPDoc 指南。因此,我不知道任何 IDE 已经为其自动完成功能提出了一种方法来处理用例。

      PHPDoc 可能采取的一种方法是使用“@return $this”作为表示流畅方法的约定,因为它与代码语法本身相匹配,因此非常清晰。我怀疑在标准本身包含此用例之前,任何 IDE 都会构建该功能。

      在短期内,我认为您多余的“ChildClass::say_hi(){parent::say_hit();}”可能让您的 IDE 自动完成功能正常工作。同样,可能,因为自动完成功能也可以识别链接自身的方法(例如 $foo->bar()->baz()->roll()->tide();)可能不存在。

      【讨论】:

      • 这似乎适用于 Netbeans,但 @return $this 会很方便......
      • 原来phpDocumentor 2.x确实识别“@return self”和“@return $this”来实现该方法是一个“流利”的方法。在生成的文档中,它突出显示了“Fluent Interface”方法,并且还调整了显示在 chlid 类文档中的返回类类型,其中显示了继承的父方法。一旦 2.0.0 stable 正式发布,我猜 IDE 将实现对这种语法的识别。希望他们的自动完成逻辑能够“流畅”地识别并正确调整方法继承。
      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多