2011-10-22 244 views
16

我對PHP相當陌生,並且剛開始使用NetBeans來開發我的PHP代碼。爲什麼要在註釋中聲明PHP變量類型?

因爲我在查詢中輸入了一個變量,所以彈出一個對話框並要求我完成註釋以保存變量類型。我做了一些調查,發現這似乎是NetBeans的一個流行功能,但我找不到任何信息向我解釋爲什麼是這種情況。

爲什麼有人想在一個評論中放置一個PHP變量的類型?它是用於開發還是實際上有利於代碼本身?它是完整的還是可選的?

+0

你能舉一個你的意思嗎? –

+0

@AurelioDeRosa - 以下是描述該功能的頁面的鏈接:http://blogs.oracle.com/netbeansphp/entry/defining_variable_type_in_a – stefmikhail

+0

哦......現在我明白你的意思了。那麼,Jonathan Spooner的答案是正確的。 –

回答

28

添加在方法的註釋中一個@var標籤類型將允許的NetBeans給你看代碼完成。這當然是可選的,但完全記錄您的代碼總是一個好主意。

編輯: NetBeans提示爲您自動生成註釋的提示是使用/**擴展。要做到這一點,只需將光標放在您想要文檔的屬性或方法上並鍵入/**,然後按ENTER鍵即可。這將擴展phpDoc樣式註釋並添加適當的標籤。

編輯2: 您可以使用一個屬性@var標籤,你可以使用@param標籤上的方法來實現與傳遞給方法的參數相同的效果。而使用屬性

在財產使用@var標籤會給你的代碼提示任何地方它是可見:

在使用
/** 
* 
* @var My_Type 
*/ 
private $_myProperty; 

上的方法使用@param標籤會給你的代碼提示參數裏面的方法:

/** 
* 
* @param My_Type $obj 
*/ 
public function myMethod($obj) { 

} 

另一種方式來實現,同時還提供類型安全的一點點相似的效果是使用PHP的type hinting機制:

public function myMethod(My_Type $obj) { 

} 

注意,該方法在方法簽名中指定的類型。現在的NetBeans將提供可使用@param標籤和PHP會產生E_RECOVERABLE_ERROR如果傳遞到方法的類型不是指定了同一類型的方法中相同的代碼完成。如果您有興趣瞭解更多關於上述錯誤的信息,請參閱PHP's documentation regarding errors以及如何處理它們。

+0

在我的情況下,我有一個名爲'$ clause'的變量,並且我通過使用'gettype($ clause)'知道該類型是'string',但NetBeans中的自動補全沒有'string'作爲選項。它在NetBeans中名稱不同嗎?你能否給我舉個例子來說明我的情況? – stefmikhail

+0

var標籤只支持PHP lib中包含的用戶定義類型或類的代碼完成。請參閱編輯提示 –

+0

謝謝,但我仍然有問題爲我的變量選擇一個類型。有沒有可以描述變量類型的文檔? NetBeans中可用的所有選項對我而言都是陌生的,我不確定要選擇哪個選項。正如我所說的,我使用'gettype'來查找'$ clause'的變量類型爲'string'。然而,沒有'string'類型作爲選項。我使用錯誤的方法嗎? – stefmikhail

1

由於PHP是一種鬆散/鴨子類型的語言,當你創建一個大型程序的類型提示可以幫助你或其他人明白是怎麼回事,如果一個問題應該出現。例如,期待一個混合類型併發送一個整數。

+0

http://php.net/manual/en/language.oop5.typehinting.php –

9

我猜你在談論這樣的事情:

/** 
* @var SimpleXMLElement $xml 
*/ 
private $xml; 

這就是所謂的phpDoc comment。它允許您生成API文檔(like this one for instance)。此外,大多數IDE(包括Eclipse和NetBeans)也支持該語法,並提供動態代碼完成等。

2

儘管NetBeans的用它來自動完成它往往是有用的記錄您的代碼:

在這種情況下,你知道這是什麼方法,得到什麼,但返回的代碼中你不知道發生了什麼事

/** 
* Returns some stuff 
* @param string $someObj 
* @return array 
*/ 
public function someMethod($someObj) { 
    $factoredObj = getObject($someObj); //you are not sure what type it returns 
    $resultArray = $factoredObj->toArray(); 
    return $resultArray; 
} 

你可以用/* @var $variable type */評論它裏面的代碼

/** 
* Returns some stuff 
* @param string $someObj 
* @return array 
*/ 
public function someMethod($someObj) { 
    /* @var $factoredObj someType */ 
    $factoredObj = getObject($someObj); 
    $resultArray = $factoredObj->toArray(); 
    return $resultArray; 
} 

$factoredObj = getObject($someObj); /* @var $factoredObj someType */ 
7

如果你想聲明的情況下的變量的類型,其中變量不是類屬性,而只是一個變量擁有一些返回的值,使用單星的意見,然後@var其次是你的變量名稱,最後是變量的類型。例如:

/* @var $errorMessage NotificationMessage */ 
$errorMessage= $allMessages->rewind()->current(); 

會告知NetBeans或PhpStorm即$的errorMessage是NotificationMessage的一個實例,你應該得到的代碼完成該變量。

+1

這也適用於PHPStorm。 – Buffalo

相關問題