2012-12-10 36 views
3

我上次查看(2008)php中的註釋並沒有如此廣泛的傳播。在閱讀了一些材料並做了一些「Google搜索」之後,我仍然有點困惑。可能有人提供了一個最小的工作的例子,說明如何在PHP中使用註釋:
讓我們只想說,我想是這樣工作的:php註釋 - 最小工作示例

class ClassName 
{ 
    /** 
    * @DefaultValue("test") 
    */ 
    public $prop; 
} 

// so that i can do 

$kls = new ClassName(); 
$kls->prop // => test 

我還沒有做過PHP在很長一段時間

UPDATE
這個問題的目的是要了解像symfony,flow3doctrine這樣的庫/框架如何實現它們的註釋。

+0

http://stackoverflow.com/questions/3623499/how-is-annotation-useful-in-php –

+0

的DUP可能你指的是phpDocs? – dnagirl

+0

不,我沒有意識到 - 我希望能夠理解當你使用symfony'@ routes'註釋時 – krichard

回答

4

PHP尚未支持註釋。有一個RFC for a proposed implementation,但它仍然不知道是否或何時會發生。

您給出的特定示例可能會被IDE解釋爲自動完成的值,否則您只能執行public $prop = 'Test';,但我想您已經知道這一點,這不是您的真正意圖。

+0

良好的打電話的意圖:P – krichard

0

PHP不支持註釋(還)。

我在PHP中使用註釋影響代碼流的唯一地方是phpUnit,它支持用於處理測試腳本各個方面的許多註釋標記(例如@DataProvider@ExpectedException)。

工作得很好,但不是由PHP本地處理;在包含它並正常運行代碼之前,phpUnit必須解析腳本本身。對於單元測試腳本來說足夠公平,但不是生產系統的理想解決方案。

所以我認爲真正的答案是,你必須等到PHP本地實現註釋。我相信有一個建議,但它肯定不會很快發生 - 它絕對不會在5.5,明年發佈。我認爲5.6或更高版本的功能並沒有任何固定的計劃,但是如果我們至少延長到2014年,甚至假設您的託管服務提供商或服務器管理員願意立即升級。

2

PHP不應該支持註釋,它們在PHP開發人員眼下是一個災難。他們造成了很多問題:

  1. 他們打破版本控制。如果您希望在不同項目中使用兩個不同配置的對象實例,則它們將成爲不同的分支,即使它的配置已更改,而不是邏輯。

  2. 它們降低了可移植性。如果您在使用註釋的兩個項目之間移動類,註釋可能會破壞第二個項目

  3. 它們會破壞封裝。應用程序代碼不應該關心它如何在外部使用。註釋告訴客戶代碼它應該做什麼,而不是讓客戶代碼決定。在您的@DefaultValue示例中,如果您在某處注意不注意註釋的地方使用該類,該怎麼辦?無論如何,如果尚未設置默認值,課程是否會工作?是?沒有?也許?無論答案如何,在API中都不清楚,並且無法知道該對象是否已經準備好履行其職責。

  4. 它們限制了靈活性。以Symfony的@Inject爲例,不可能用不同的注入參數創建兩個類的實例。

見:Annotations are an abominationPHP Annotations Are a Horrible Idea對於爲什麼應該避免它們更詳細的解釋。

+4

我想你錯過了這個問題的重點。 [krichard](http://stackoverflow.com/users/515399/krichard)要求提供「_minimal工作示例,說明如何在php_中使用註釋」,而不是關於在PHP中使用註釋的個人意見。討論如果可以在PHP中使用註釋感覺就像舊的「_4 space vs 2 space indent_」辯論。 –

+0

有時候人們會問錯誤的問題,因爲他們認爲這是實現他們想要的最好方式。把它們引向正確的方向總是比較好的。例如。 「我如何在這裏使用全局變量?」或者「我怎樣才能讓這個單身?」是一個同樣有效的問題。但是,最好的答案是解釋更好的選擇,以及爲什麼他們會比僅僅因爲要求教他們而教壞人不好的做法更好。空間沒有實際的好處,註釋(用於配置)有幾個主要缺點。 –

+0

我明白你的觀點並且是的,在某些情況下,最好是分歧才能指向正確的方向。但我認爲註釋更多的是個人(或團隊)的決定和喜悅,而不是一個「非常糟糕的主意」。 –

2

PHP Manual -> Function Reference Variable and Type Related Extensions -> Reflection中,在幾個反射類(ReflectionClass,ReflectionMethod,ReflectionFunction,ReflectionFunctionAbstract,ReflectionProperty ...)中存在getDocComment()方法,您可以在其中獲取文檔註釋塊。然後按照你想要的方式處理你的評論。例如:

class Foo { 
    private $a; 
    private $b; 
    ... 
    /** 
    * @annotation('baz') 
    */ 
    public function bar() { 
     ... 
    } 
} 

$reflMethod = new ReflectionMethod('Foo', 'bar'); 

//prints 
//string(26) "/** 
// * @annotation('baz') 
// */" 
var_dump($reflMethod->getDocComment());