2010-01-14 104 views
66

真的有必要做這樣的事情:PHPDoc:@return void必要?

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

我有沒有返回值不少方法,看來真是多餘把像這樣的評論。離開它會被認爲是不好的形式嗎?

回答

73

如果它爲文檔明確說明,則將其保留,但並非嚴格必要。這是一個完全主觀的決定。

就我個人而言,我會放棄它。

編輯
我糾正了。一點點的谷歌搜索後,wikipedia page說:

@返回[類型說明]這個標籤不應該用於void返回類型定義的構造函數或方法使用

的phpdoc.org網站上說:

@返回的數據類型描述
@返回datatype1 | datatype2描述

的@return標籤是用來記錄的功能或方法的返回值。 @returns是@return的別名,用於支持其他自動文檔的標記格式

數據類型應該是有效的PHP類型(int,string,bool等),返回的對象類型的類名,或者簡單地「混合」。如果要顯式顯示多個可能的返回類型,請列出它們不帶空格的管道分隔符(例如「@return int | string」)。如果在@return標記中使用類名稱作爲數據類型,phpDocumentor將自動創建一個指向該類文檔的鏈接。另外,如果函數返回多個可能的值,請使用|將它們分開字符,並且phpDocumentor將解析返回值中的任何類名稱。 phpDocumentor將顯示未修改的可選描述。

Sooo ...在此基礎上,我會說離開了虛空。至少不符合標準。

+0

添加它甚至做什麼?我相信PHPDoc,如果你不記錄返回類型,它會自動假定'void'並將其放入文檔中的方法簽名中。 – 2010-01-14 01:16:22

+0

@Marc W:看我的編輯。不僅沒有必要,它不應該被使用。 – 2010-01-14 01:33:10

+2

自2010年以來可能發生了變化,但是目前phpdoc.org說:「沒有'return'值的函數和方法,@return標記可能會在這裏省略,在這種情況下@return void是隱含的。 – TFennis 2013-12-17 10:39:52

13

我必須編輯我的答案,因爲我最近學到的東西。

使用@return void代替@return null具有很特殊的含義,請考慮以下兩個PHP代碼示例。

<?php 

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

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

在第一個例子PHP實際上將返回NULL,因爲PHP總是返回NULL。但是返回的值對調用者沒有用處,因爲它沒有說明函數做了什麼。 IDE可以使用記錄的信息@return void來指示開發人員使用沒有用途的返回值。

<?php 

$foo1 = return_never(); 

$foo2 = return_sometimes(); 

第一個電話是毫無意義的,因爲變量總是包含NULL,第二個可能實際上包含的東西。如果我們把函數調用放到條件中,這會變得更加有趣。

<?php 

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

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

正如你所看到的,@return void有其使用情況,如果適用,應使用。

另請注意,它將成爲即將推出的PHP PSR-5標準的一部分。 [1]

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

+0

好點,但如果函數退出,則表示它不返回'null'。我對嗎?我認爲,在這種情況下'@returns void'是最好的選擇。 – 2014-09-22 13:22:14

+0

如果你不返回任何東西,函數總是返回NULL。一個使用'exit()'或類似的東西的函數仍然返回'NULL',但你不會收到它,因爲PHP直接跳到關閉階段而忽略了你的代碼。 – Fleshgrinder 2014-09-23 09:19:30

+0

有趣。我會假設,如果你說的是真的,當我叫'退出'時,'finally'塊會運行。兩者之間並不直接相關,但它感覺不對。謝謝你的啓發。 :) – 2014-09-23 12:33:10

39

據的phpDocumentor,@返回空隙是有效的:

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

... 這種類型通常僅用於定義當返回類型爲 的一種方法或函數。基本定義是用這種類型指示的元素 不包含值,並且用戶應該不依賴任何檢索到的值。

例如:

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

在上面沒有返回語句的例子中,指定並因此是不確定的 返回值。

來源:http://www.phpdoc.org/docs/latest/for-users/phpdoc/types.htmlarchived page)。

+2

這是我指出「這是正確答案」的地方。 :) – Typo 2013-10-11 06:13:15

+1

正確的答案應該改爲這個。 – BadHorsie 2015-07-10 10:11:55

+2

事實上,這將是這裏最好的答案。這也是即將出現的PSR-5標準的一部分。我會採用以下方法進行語義有意義的編程:http://www.dereuromark.de/2015/10/05/return-null-vs-return-void/ – mark 2015-10-06 09:33:24

2

這是我如何理解和使用的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(); 
} 
3

自PHP 7.1,void is a valid return type可以上的功能來執行。

我會總是將它添加到docblock。

編寫它的另一個好處是將void方法與可能返回任何內容的方法區分開來,但由於疏忽導致文檔塊上沒有@return條目。