2011-09-02 57 views
2

例如,這是我的課:靜態調用與動態調用:哪一個具有更好的性能?

<?php 
Class Example 
{ 
    public function example_function() 
    { 
    echo "example code"; 
    } 
} 
?> 

以下哪一個將是最好的,性能明智?

1)

Example::example_function(); 

2)

$example = new Example(); 
$example->example_function(); 

它們之間有什麼區別?

+4

他們只是不同,沒有理由比較他們的表現(儘管這很接近)。順便說一句,這樣的問題很少有答案。爲了獲得**代碼中的瓶頸** - 運行分析器並查看。 – zerkms

+0

@zerkms你確定嗎? –

+1

我確定在什麼?這不是需要優化的東西。靜態調用與動態調用的性質不同。它們不可互換,所以無需進行比較。 – zerkms

回答

7

這不是一個表現的問題。它確實不是。如果有的話,這個差別是微不足道的,幾乎不可測量。

如果您需要使用靜態方法設計您的類,請使用靜態方法。
如果你需要實例化你的類,你別無選擇,只能使用對象方法。

這是一個與性能無關的類設計決策。

+0

我徘徊,如果真的有一個基準測量的差異。每個人都只是說他們幾乎是一樣的,但我不認爲他們是。 – samayo

+1

做一個基準很簡單。但它仍然毫無意義。兩者完全不同,用於完全不同的目的,所以它甚至不是一種選擇。它試圖將蘋果與橘子進行比較,因此它沒有實際意義。 – deceze

+1

以我的案例爲例。我正在創建一個安全的文件上傳類,並且通過使這個類成爲靜態類,我希望能夠在至少速度方面獲得一些性能提升。即使那個速度太小,測量也是積極的,考慮到通過使班級動態不能獲得那麼多的收益。所以,我的問題是,該類不需要單元測試,什麼阻止每個人使用靜態類而不是動態?確切地說,是 – samayo

3

如果您打算訪問類元素,則需要通過類的實例訪問該函數。例如,通過一個靜態方法調用(Example::example())訪問時,這是不合法的:

class Example 
{ 
    private $str = 'example'; 

    public function example() 
    { 
     echo $this->str; 
    } 
} 

所以,問題不是性能,而是如何你要使用你的類和/或功能

你應該真的給PHP OOP docs一個閱讀。

+0

您可以從靜態方法內部訪問類屬性。儘管如此,屬性本身也必須是靜態的。 –

+1

是啊..我不想詳細介紹這些東西(列舉一些太多的例子,PHP OOP文檔相當詳盡;)) –

+1

只要實例化類,您的示例就完全「合法」 。你可能想要限定什麼是非法的......? – deceze

3

兩者之間的區別就執行速度而言可能是微不足道的。但他們做了兩件完全不同的事情。

Example::example_function();

被治療類作爲全局singleton對象。 Theres只有一個Example對象,它可能有一些公共方法,可以在任何包含該類的地方調用。

$example = new Example(); 
$example->example_function(); 

正在創建一個Example類的實例,這意味着可以有許多使用不同屬性運行的示例。

你將如何使用這兩個將完全取決於你的項目的性質和你想要達到的目標。

0

正如其他評論所暗示的那樣,看起來關於性能的問題是次要的。還有其他的決定和策略可以改善你的表現,但是這更像純粹的設計。

我會建議這是一個問題好設計vs壞設計策略?我解釋一下自己。

如果您不需要面向對象,那麼爲什麼使用面向對象?我的意思是說,創建對象似乎很愚蠢,然後訪問它們就好像這是標準的程序功能。

我只是在研究這個問題,所以請隨時辯論我的意見,我很高興收到關於此問題的反饋(正面或負面):-)。