PHPDoc:@return voidが必要ですか?


81

このようなことをする必要が本当にありますか?

/**
 * ...
 * 
 * @return void
 */

戻り値のないメソッドがかなりありますが、コメントにこのようなものを入れるのは本当に冗長なようです。それを省くことは悪い形と見なされますか?

回答:


91

ドキュメントで明確になっている場合は、そのままにしておきますが、厳密には必要ありません。それは完全に主観的な決定です。

個人的には省略します。

編集
私は修正されたままです。少しグーグルした後、ウィキペディアのページには次のように書かれています。

@return [タイプの説明]このタグ、voidの戻り値の型で定義れたコンストラクターまたはメソッドには使用ないでください

phpdoc.orgのWebサイトには次のように書かれています。

@returnデータ型の説明
@returnデータ型1 |データ型2の説明

@returnタグは、関数またはメソッドの戻り値を文書化するために使用されます。@returnsは、他の自動ドキュメンターのタグ形式をサポートするための@returnのエイリアスです。

データ型は、有効なPHP型(int、string、boolなど)、返されるオブジェクトの型のクラス名、または単に「混合」である必要があります。複数の可能な戻り値の型を明示的に表示する場合は、スペースなしでパイプ区切りでリストします(例: "@ return int | string")。@returnタグのデータ型としてクラス名が使用されている場合、phpDocumentorはそのクラスのドキュメントへのリンクを自動的に作成します。さらに、関数が複数の可能な値を返す場合は、|を使用してそれらを区切ります。文字、およびphpDocumentorは、戻り値のクラス名を解析します。phpDocumentorは、オプションの説明を変更せずに表示します。

すっごく...それに基づいて、私は空白を省くと言うでしょう。少なくとも、それは非標準です。


それを追加しても何かしますか?PHPDocは、戻り値の型を文書化しない場合、自動的に想定voidされ、ドキュメントのメソッドシグネチャに配置されると信じています。
マークW

@Marc W:私の編集を参照してください。必要がないだけでなく、使用することも想定されていません。
Jonathan Fingland 2010年

2
2010年以降変更されている可能性がありますが、現在phpdoc.orgは次のように述べています。「return値のない関数とメソッド。ここでは@returnタグを省略できます。その場合、@ returnvoidが暗黙指定されます。」
TFennis 2013

@TFennisありがとう。従来の見積もりはそのままにしておきますが、phpdocは、それを使用している開発者の数に対して、より寛容になっているようです。ウィキペディアのページで、回避に関する声明に対して[要出典]と表示されていることに気付きました@return void
ジョナサン・フィンランド

私の見解では、この答えは時代遅れです。この型voidはPHP7.1以降の有効な戻り値の型であり、@ tivnetが以下の回答で示しているように、phpDocumentorによるとphpDocsの有効な型でもあります。
ErnestoAllely20年

50

phpDocumentorによると、@ returnvoidは有効です。

http://www.phpdoc.org/docs/latest/guides/types.html#keywords

...この型は通常、メソッドまたは関数の戻り値の型を定義する場合にのみ使用されます。基本的な定義は、このタイプで示される要素には値が含まれておらず、ユーザーは取得された値に依存してはならないということです。

例えば:

 /**
  * @return void
  */
 function outputHello()
 {
     echo 'Hello world';
 }

上記の例では、returnステートメントが指定されていないため、戻り値は決定されていません。

出典:http//www.phpdoc.org/docs/latest/for-users/phpdoc/types.htmlアーカイブページ)。


4
ここで私は「これが正解です」と指摘します。:)
タイプミス2013年

3
正解はこれに変更する必要があります。
BadHorsie 2015

4
確かに、これがここでの最良の答えでしょう。これは、今後登場するPSR-5標準の一部でもあります。セマンティックで意味のあるプログラミングには、次のアプローチを使用します。dereuromark.de
マーク

15

最近学んだことがあるので、答えを編集する必要があります。

@return void代わりに使用することは@return null非常に特別な意味を持ち、次の2つのPHPコードの例を検討してください。

<?php

/**
 * @return void
 */
function return_never() {
    echo "foo";
}

/**
 * @return null|string
 */
function return_sometimes() {
    if ($this->condition()) {
        return "foo";
    }
}

最初の例NULLでは、PHPは常にを返すため、PHPは実際にはを返しますNULL。ただし、戻り値は、関数が何をしたかについては何も述べていないため、呼び出し元には役に立ちません。IDEは、の文書化された情報を@return void使用して、目的を果たさない戻り値が使用されていることを開発者に示すことができます。

<?php

$foo1 = return_never();

$foo2 = return_sometimes();

変数には常にが含まれるため、最初の呼び出しは無意味ですNULL。2番目の呼び出しには実際に何かが含まれている可能性があります。関数呼び出しを条件付きにすると、これはさらに興味深いものになります。

<?php

if (($foo1 = return_never())) {
    // Dead code
    var_dump($foo1);
}

if (($foo2 = return_sometimes())) {
    var_dump($foo2);
}

ご覧のとおり@return void、ユースケースがあり、該当する場合は使用する必要があります。

また、今後のPHPPSR-5標準の一部になることにも注意してください。[1]

[1] http://www.php-fig.org/psr/


良い点ですが、関数が終了すると、それは戻りませんnull。私は正しいですか?その場合@returns voidが最善の選択肢だと思います。
タマーシュバルタ2014

NULL他に何も返さない場合、関数は常に戻ります。を使用する関数exit()などは引き続き返されNULLますが、PHPはコードを無視してシャットダウンフェーズに直接ジャンプするため、関数を受け取ることはできません。
フレッシュグラインダー2014

面白い。あなたの言うことが本当ならfinally、私が呼び出すとブロックが実行されると思いますexit。両者の直接的な相関関係ではありませんが、正しくは感じられません。私を啓発してくれてありがとう。:)
タマーシュバルタ2014

より良い言い回しは、「[…]はまだ[…]を返すだろうNULL」でした。exitPHPに現在のコードの実行を停止し、シャットダウンフェーズに直接ジャンプして、この時点以降のコードを無視するように指示するだけで、gotoと比較できると思います(したがって、現在の関数がネストされているよりも外側のスコープ[グローバル]にあるgoto) 。finalブロックは実行されませんが、他の多くの関数は実行されます(たとえばregister_shutdown__destruct)。
フレッシュグラインダー2014

それはもっと理にかなっているように聞こえます、そしてそれは私が最初に考えたものです。また@returns void、関数がスクリプトの実行全体を終了することを示すために使用することも決定しました。たとえば、HTTPリダイレクトなどです。また、関数が何も返さないように設計されていないことを示すために使用する方がよいでしょう。
タマーシュバルタ2014

7

php 7.1以降、voidは有効な戻り値の型であり、関数に適用できます。

私はいつもそれをdocblockに追加します。

それを書くことのもう一つの利点は、void何かを返すかもしれないが、@return過失によってdocblockにエントリを持たないメソッドからメソッドを区別することです。


3

PhpDocumentorアノテーションを理解して使用する方法は次のとおりです。

<?php

/**
 * This method always returns string.
 * @return string
 */
public function useCase1()
{
    return 'foo';
}

/**
 * This method returns 2 data types so list them both using pipeline separator.
 * @return string|false
 */
public function useCase2()
{
    if ($this->foo === 1) {
        return 'foo';
    }
    return false;
}

/**
 * This method performs some operation and does not return anything so no return
 * annotation is needed.
 */
public function useCase3()
{
    $this->doOperation();
    $this->doAnotherOperation();
}

/**
 * If condition passes method returns void. If condition does not pass it returns
 * nothing so I think that specifying the return annotation with void is in space. :)
 * @return void
 */
public function useCase4()
{
    if ($this->foo === 1) {
        $this->doOperation();
        return;
    }
    $this->doAnotherOperation();
}

1

個人的には、これに欠けている大きなことは、関数が返すことを文書化することが重要だということだと思います。現在、標準には、決して戻らない関数のドキュメントがありません。したがって、return voidは、この関数が実際に戻るという言い方です。

このコードブロックを検討してください

<?php

/**
 * @return void
 */
function return_void() {
    echo "foo";
}

/**
 * @return null|string
 */
function return_sometimes() {
    if ($this->condition()) {
        return "foo";
    }
}

/**
* This function actually doesnt return at all - it kills the script
**/
function noreturn() {
     //do somthing then
     die(); //or exit()
}

明らかに、@ returnの使用は、少なくとも関数が戻ることを示しています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.