2010-03-04 39 views
8

反射API是用來操縱OOP的東西的好東西,看起來像大多數開發人員甚至沒有意識到或從未使用過。PHP:The Reflection API - 對PHP很有用處

反射API要求:

PHP 5帶有一個完整的反射 API,增加的能力 反向工程師類,接口, 功能,方法和擴展。 此外,反射API 爲函數,類和方法提供了檢索文檔註釋 的方法。

問:

  • 爲什麼它有它的大部分方法/屬性上幾乎沒有文件?你在那裏看到的文檔上的這條消息:

此功能目前不 記錄;只有它的參數列表是 可用。

在哪裏可以找到它的文檔?

  • 它是未來兼容的,換句話說,我可以在我的MVC框架中使用嗎?
  • 爲什麼它使用較少,有什麼問題呢?
+0

@sarfraz我聽到很多針對它的表現的批評。不完全確定他們是多麼有根據,但顯然這很慢。 - 也沒有很多好的例子可以用於文檔生成。我不認爲人們通常知道它有什麼可能。 - 我很好奇看到任何真實世界的例子,它被用在盒子外面,可以這麼說。如果你把它添加到你的問題將會很好。 – anomareh 2010-03-04 07:34:53

+0

@anomareh:謝謝你的評論和表現。我所知道的一個場景是,當你使用帶引用參數的'call_user_func_array'時,它會拋出一個錯誤,但是有辦法使用反射api來處理。謝謝 – Sarfraz 2010-03-04 07:39:29

回答

15

反射絕對是在這裏停留。您可以使用它,但請記住它對於簡單的UseCases來說是緩慢和過度的。使用Classes/Objects function package中的某個功能通常是更快的選擇。

其中反射派上用場的UseCase是在解析類的DocBlock中的註釋時使用的。例如,PHPUnit使用註解@test來告訴PHPUnit TestRunner它應該將方法視爲測試。 @covers註釋將幫助它收集代碼覆蓋數據。 FLOW3框架使用Annotations for their AOP framework

不幸的是,PHP> 5.3的一些新增功能還沒有被記錄得那麼多。 Just look at the SPL。一樣。這並不意味着你不能使用它。 Reflection API非常具有表現力,易於從方法名稱中找出。 Google經常有關於如何使用特定擴展的博文。對於反射API,請上網:

和SPL


一些很酷的東西我剛剛發現的。從5.1.2開始,你也可以invoke the Reflection API from the command line

$php --rf strtotime 
Function [ <internal:date> function strtotime ] { 

    - Parameters [2] { 
    Parameter #0 [ <required> $time ] 
    Parameter #1 [ <optional> $now ] 
    } 
} 
+0

有關於幕後實際工作情況的信息嗎?我知道這不是超快的,這是可以理解的。但是,它是因爲它總是分析代碼,還是使用更聰明的東西,比如,當類被加載到內存時,它會被消化成更小的塊,並且這些信息被用來「反映」實際的類? – 2014-09-08 11:53:50

+0

@IanBytchek你可以查看源代碼http://lxr.php.net/xref/PHP_TRUNK/ext/reflection/ – Gordon 2014-09-08 13:08:07

+0

我可以和我做過,我的C技能只比猴子高一點,我想知道你是否願意已經有了答案。知道不經過艱苦的工作會很有趣 - 不是通常的做法,承諾:) – 2014-09-08 14:00:15