2014-12-19 64 views
2

PHP 5可以做一些(有限)type hinting,但是,在我看來,在真實世界的項目中,類型通常在doc註釋中描述。例如,而不是這樣的:PHP類型提示 - 代碼與註釋

/** 
* Test method 
*/ 
function test(SomeType $param1) { 
    ... 
} 

會有更常見是

/** 
* Test method 
* 
* @param SomeType param1 
*/ 
function test($param1) { 
    ... 
} 

什麼是兩種方法的優點和缺點?如果我正確地假設PhpDoc方法更常見,那爲什麼?爲什麼人們不會更多地使用內置的語言功能?

編輯:第三個選擇是使用這兩種方法相結合:

/** 
* Test method 
* 
* @param SomeType param1 
*/ 
function test(SomeType $param1) { 
    ... 
} 

不過,我個人還沒有看到這種使用過於頻繁(看着像Symfony的或PHPUnit的庫),這似乎也就像做一些工作沒有多少額外的好處說實話。也許這就是爲什麼它不經常出現的原因。

+0

在第一個中,你也可以使用'@param SomeType $ param1'。它阻止你傳遞除SomeType之外的任何類型的類型。其次將只顯示你在phpDoc中,但'$ param1'可以是任何類型。 – vaso123 2014-12-19 10:54:43

+0

好點,我已經更新了OP。 – Borek 2014-12-19 11:01:19

+0

如果您使用的是自動完成的IDE,您還可以鍵入提示內聯,這會隨時派上用場:/ * @var $ somevar \ YourNamespace \ YourObject */ – Jon 2014-12-19 11:02:52

回答

1

我個人會使用兩者。

第一個選項適用於控制傳遞給方法的對象。第二個通常可以通過任何現代的IDE自動添加,它使您的代碼更具可讀性。

2

第一件事:PHP的提示有不同的提示能力比PHPDoc。差異是(至少):

  • 標量類型。在PHP中你不能提示標量類型,而沒有什麼能阻止你暗示

    /** 
    * @param string $param Param description 
    */ 
    
  • 陣列提示的。在PHPDoc中,你可以提示,該參數(或返回值)是一些東西的數組。它將是:

    /** 
    * @param ClassName[] $param Param description 
    */ 
    

    並且這是的含義是 - ClassName的實例數組。當涉及到返回類型時,這非常有用(因爲IDE可能會在該數組的迭代中替換方法,因此,您將知道您做的是否正確)。但是,在PHP中,你只能輸入它的提示

    function functionName(array $param) { /*...*/ } 
    

    所以它不可能實現什麼是實際的數組元素。對於您的信息,有一個相應的RFC作爲typehinting作爲一些元素的數組,目前被拒絕 - 但可能在未來,這種可能性將出現在PHP中。

但是,在另一方面,使用PHP typehints仍然是不同的事,通常你應該做兩個 - 所以,如果有可能在PHP某種程度上暗示(如上面陣列樣品) - 做,添加PHPDoc塊也是如此。 PHP typehint允許您在語言級別執行行爲,而PHPDoc只是「信息」源,它只提供信息目標,並且不能阻止傳遞非法參數類型。

+0

好點,我只是不確定關於最後一段。雖然從理論上說,有兩種類型的提示肯定會感覺更好,但它在實踐中可能不會增加太多價值,至少這是我看到它的方式,如果你看看現實世界的項目,看起來我不是單獨。 – Borek 2014-12-19 11:04:22

+0

但它增加了。如果你有一些實例的數組,你將在PHP和PHPDoc中鍵入它,所以你至少不能將非數組傳遞給函數(在語言級別上),另一方面,你將能夠使用IDE替換。所以 - 是的,PHP的提示是有限的,但是你應該儘可能地使用它們來縮小傳入參數的類型,如果你知道那個上下文的話。 – 2014-12-19 11:06:05

+1

在執行時*的類型*的實際執行是將類型提示放入代碼本身。把它放在PHPDoc中是很常見的做法,主要是因爲PHPDoc *早於PHP的typehinting,因此PHPDoc擁有一個*記錄的類型是當前用戶知道代碼期望的最好方法。 Doc生成器通常會假定PHPDoc信息是真實信息並使用它,但如果沒有給出PHPDoc,它們也會回退到代碼本身。 IDE通常遵循相同的行爲。 – ashnazg 2015-01-14 22:29:36