4

この質問は一般的な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 標準を変更して、特別なキーワードを許可する
  • docblock を再宣言するためだけに親を呼び出す余分な say_hi() メソッドを追加します。
  • 戻り値の型をまったく指定しないでください。IDE が何return $this;を意味するかを決定します (これは機能しますか?)
4

2 に答える 2

5

これは次のように解決できます。

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

「@return static」ステートメントはまさにあなたが望むものを可能にします.PhpStormはそれでうまく動作します.

于 2013-10-25T13:52:34.370 に答える
2

あなたが説明するものは、一般に「流暢なインターフェース」と呼ばれ、オブジェクトのすべてのメソッドが機能し、オブジェクト自体を返します。

私は個人的に、それを正確に行う方法について最終化された PHPDoc ガイドラインを見たことがありません。そのため、どの IDE も、ユース ケースを処理するためのオートコンプリート機能の手段を提供しているとは知りません。

PHPDoc がこれを採用する可能性が高い方法は、「@return $this」を流暢なメソッドを示す規則として利用することです。これは、コード構文自体に一致し、したがって非常に明確であるためです。標準自体にこのユース ケースが組み込まれるまで、IDE がその機能を組み込むとは思えません。

短期的には、余分な "ChildClass::say_hi(){parent::say_hit();}"IDE オートコンプリートを機能させる可能性があると思います。オートコンプリートを使用すると、メソッド チェーン自体も認識されるため (たとえば、$ foo- >bar()->baz()->roll()->tide();) は存在しない可能性があります。

于 2012-09-12T14:48:50.897 に答える