2011-07-14 53 views
0

在以下示例中, 通過搜索文件get,我無法輕鬆找到調用get() of Book class的地方。
因爲有很多get不屬於Book class
如何找到調用非靜態方法的地方?

class Book { 
    function get() { 
    } 
} 

class Pen { 
    function get() { 
    } 
} 

$obj = new Pen; 
$obj->get(); 

$obj = new Book; 
$obj->get(); 

但如果我只使用函數或靜態方法,如下面的代碼, 我可以很容易地找到與Book_getBook::get搜索文件的地方。
如果我使用的功能,我可以通過只搜索Book_get找到where the function is calledwhere the function is defined

function Book_get() { 
} 

function Pen_get() { 
} 

Book_get(); 
Pen_get(); 


class Book { 
    static function get() { 
    } 
} 

class Pen { 
    static function get() { 
    } 
} 

Book::get(); 
Pen::get(); 

當我使用非靜態方法,我怎麼能輕易找到他們被稱爲地方?
或者更好地使用函數或靜態方法而不是非靜態方法?

+0

您使用的是IDE嗎?如果是這樣,哪一個?此外,這與php有什麼關係? –

+0

@Ted Hopp我不使用IDE。我只用文本編輯器。我應該使用IDE嗎? 在需要像C++一樣編譯的語言中,如果方法調用錯誤,編譯時會出現 錯誤。 但是在像php這樣的腳本語言中, 錯誤可能會在發佈後的運行時發生。 所以這是更嚴重的問題爲PHP。 但是,這當然與所有語言有關。 –

+0

將get()的名稱更改爲oldGet()。重新編譯並且編譯器會告訴你它已經中斷了。這些是使用get()的位置 –

回答

1

當我使用非靜態方法時,如何輕鬆找到調用它們的位置?

類成員函數可以用多種方式來調用,
通過類
的情況下通過多態(動態分配)

對於第一種情況下,任何合理好的代碼分析工具或IDE將能夠根據對象的類型告訴你函數被調用的類,但是 我想沒有簡單的方法來跟蹤第二種情況而不檢查代碼,我懷疑任何代碼分析工具足夠智能地告訴你究竟哪個類方法被調用(Source Insight肯定不會),因爲調度是動態的而不是編譯時間。

使用函數或靜態方法代替非靜態方法更好嗎?

使用或不使用static method需要更深入的思考不僅僅是要能找到一個搜索功能。
靜態函數沒有this指針,因此您不能訪問其內部的非靜態成員。它們只能對類的靜態成員進行操作。

1

切換到更好的IDE是最簡單的解決方案。例如,Eclipse CDT允許您查看調用方層次結構並查找方法的所有調用站點。 (雖然模板和繼承的高級案例可能仍然很難計算)

1

如果您的方法需要訪問this->中的數據,那麼您必須使其成爲非靜態方法。然後該對象需要實例化(通過new)。

如果您的所有方法都使用的是包含在函數參數中的數據,那麼請考慮使您的方法是靜態的。或者僅用靜態方法創建一個單獨的類。

Book::get(); 
Pen::get(); this will be the best to use in nonstatic 
2

你總是可以臨時重命名get爲類似xget和重建找到調用點。