2009-09-26 62 views
1

我想知道一個班是否打算調用某種方法,但在實例化班之前我想知道。這可能嗎?是否有可能在沒有首先實例化的情況下查看某個類是否調用方法?

示例:類Controller_Index在其__construct()方法內調用$this->composite('SomeCompositeClass')。類SomeCompositeClass有一個helloWorld()方法。我想看看我是否可以撥打Controller_Index->helloWorld()

基本上我想看看我的控制器是否要添加任何複合類(使用$this->composite()),以便我可以檢查這些複合類是否包含我請求的方法(helloWorld())。我想這樣做,而不必首先實例化Controller_Index

謝謝!

編輯
我想我想要做的是類似於使用PHP的思考課程,看看如果一個類的方法存在。但我不想知道該方法是否存在,我想知道該類是否會調用它。

編輯2
接口也無濟於事,因爲我不一定會從每一個控制器調用$this->composite()

也許我只是需要重新思考問題,並採用不同的方法。

回答

3

首先,你不能一般這樣做。分析一般代碼以查看它是否會在其執行過程中達到某個特定點是不可判定的,因此即使您在語法上檢測到對composite的調用,也不知道它們是否會在未實際執行代碼的情況下執行。

現在,從實際意義上講,您可以通過將代碼作爲文本加載並檢查它以調用composite來獲得一些槓桿作用,但是如果您將這些類寫入一致的時尚。它不會顯示隱藏在函數調用鏈後面的調用,會錯誤地標記有條件保護的調用,等等。您幾乎可以肯定使用另一種方法更好,例如PHP interfaces用於此類靜態分析。

0

如果您想要調用不啓動任何對象的類函數,您正在查找「static method」。

基本上靜態方法屬於類而不是類對象。所以你可以在不初始化的情況下調用它,比如'Class1::doStaticMethodAction()'

+0

我不想在沒有首先實例化類的情況下調用該方法,我想查看該類是否會調用該方法。 – 2009-09-26 18:39:40

1

我不認爲你可以以編程方式預測一個類的構造函數在執行時沒有實際執行代碼會調用什麼,除非你想進入解釋實際語言而不執行它的領域。國際海事組織,這種方法是確保一個班級實施具體方法的一種非常迂迴的方式。爲什麼不使用interfaces?你也可以重構你的composite()方法來使用type hinting來確保composite()方法只使用你的接口類型(包含你的helloworld()方法)。

相關問題