2015-10-04 86 views
1

兩片的代碼,做同樣的事情:快捷類影響性能?

class Dog 
{ 
    public $name; 
    public $breed; 
} 
$hachi = new Dog; 
$hachi->name = "Hachi"; 
$hachi->breed = "Shiba"; 

VS

$hachi->name = "Hachi"; 
$hachi->breed = "Shiba"; 

在這種情況下(使用類作爲一個結構),這兩個代碼將實現同樣的事情。除了可讀性/風格之外,使用冗長版本還有什麼好處嗎?是否存在性能問題或其他任何會阻止我將其縮短的問題?

回答

3

其實是的,即使從維護明顯問題之外還有另外一個好處。使用預先聲明的屬性PHP只需要每個類都有一個散列表,該屬性將屬性名映射到用於每個對象的內存有效C數組中的偏移量。使用動態屬性PHP需要每個對象的散列表。

因此,只要您有多個該類型的對象,就可以節省內存。


多少錢?讓我們假裝你有一個很多的狗。

「冗長」 的版本:

class Dog 
{ 
    public $name; 
    public $breed; 
} 

while (@$i++ < 1000000) { 
    $hachi = new Dog(); 
    $hachi->name = "Hachi"; 
    $hachi->breed = "Shiba"; 
    $dogs[] = $hachi; 
} 

echo memory_get_usage(true); //188747776 

「短切」 版本:

while (@$i++ < 1000000) { 
    $hachi = new stdClass(); 
    $hachi->name = "Hachi"; 
    $hachi->breed = "Shiba"; 
    $dogs[] = $hachi; 
} 

echo memory_get_usage(true); //524292096 

對於524292096的差 - 188747776 = 335544320個字節。


對於冗長的說明,請參見:Why objects (usually) use less memory than arrays in PHP

+0

非常迷人,正是我想知道的。謝謝! – dukevin

+1

爲了擴大這個答案,除了使用較少的內存外,'長版'的執行速度是'短版'的兩倍, – user2182349

-1

如果這兩個代碼的工作,然後去一個短,將其添加到一個類不會使任何更快或有效率,它很好的做法,可以幫助,如果你要添加的代碼來充當生成它。但性能明智的第二個會更好地工作

1

課程旨在幫助組織數據,而且肯定會增加開銷。

如果你試圖寫代碼,做你代表將被處理的數據的好工作,你就必須接受一定的性能損失。

第二種方法將創建幾乎不可能維護的代碼。

PHP給了我們一個非常簡單的方式來定義一個對象編程, ,這被稱爲一個類。一個類是一個包裝器,它定義並封裝了對象以及它的所有方法和屬性。 你可以把一個類作爲一個 對象的綱領性表示,這是PHP給你的接口,開發人員, 進行交互和修改的對象。而且,如果需要的話,一個類可以是 無限次使用,使它非常強大,並且代碼庫 友好。每次你想要使用一個對象時,你都不必重新定義事物 - 一個正確編碼的類被設置爲爲你做所有的工作 。

來源:http://www.htmlgoodies.com/beyond/php/object-orientated-programming-in-php-class-1-principles.html

+0

第二個方法將難以維持,但沒有處罰?或者它是一樣的嗎? – dukevin

+0

第二種方法沒有定義類的屬性 - 所以人們可以以不同的方式對類進行編碼,從而破壞它。 – user2182349

+0

假設我是唯一的維護者。再加上第一種方法,你仍然可以用相同的方式定義新的屬性。 – dukevin