2010-09-14 50 views
12

可能重複:
When should I use stdClass and when should I use an array in php5 oo code ??使用數組VS對象來存儲數據

什麼是使用這兩種結構比其他的一個好處?

// array 
$user['name'] = 'Emanuil'; 

// object 
$user->name = 'Emanuil'; 
+2

爲什麼你說1比2好?我個人不同意這種說法。你能解釋爲什麼你認爲1比2好?我們在談論效率,內存消耗,編碼實踐嗎?看看:http://particletree.com/notebook/object-oriented-php-memory-concerns/也。 – Chris 2010-09-14 14:03:27

+0

只是提示:也許陣列消耗更少的資源。 – fabrik 2010-09-14 14:03:28

+0

@Chris:我想我在某處讀到,如果你需要一個結構來存儲數據,那麼1是首選的方法。 – 2010-09-14 14:06:53

回答

27

陣列

  • 噸的array_*功能,可以在陣列中,其中大部分是非常快的工作
  • 默認情況下,他們經過值(約拷貝)
  • 輕型/簡單(只更改影響局部變量,少想事)
  • 通常用於構建數據一旦(數據不改變)
  • 所有數據是公共
  • 資源較少

對象

  • 方法可以用來保持數據更嚴格。 (IE。一個字段適合的格式支票)
  • 子類(減少代碼重複)
  • 默認情況下它們通過引用傳遞
  • 更改數據可具有級聯效應(__get__set等)
  • 通常用於是比較可變
  • 可以通過功能保護來自外部的數據和保護/私有變量數據
  • 對象
  • 功能類型提示是更靈活的(不同typehint爲不同類別)
6

只需運行一個簡單的測試:

$ts_o = microtime(true); 
for($i=0;$i<=1000;$i++) 
{ 
    new stdClass(); 
} 
$total_object = microtime(true) - $ts_o; 

對戰:

$ts_a = microtime(true); 
for($i=0;$i<=1000;$i++) 
{ 
    array(); 
} 
$total_array = microtime(true) - $ts_a; 

,並計算結果他。

echo 'Object: ' . $total_object . '/Array: ' . $total_array; 

結果:對象:0.002635 /陣列:0.001243

正如你可以看到,數組是更快的問候速度,平均46.6%INFACT。

但是當你開始添加變量,他們突然轉身:

$ts_o = microtime(true); 
for($i=0;$i<=1000;$i++) 
{ 
    $var = new stdClass(); 
    $var->booleon = true; 
} 
$total_object = microtime(true) - $ts_o; 
unset($var); 

$ts_a = microtime(true); 
for($i=0;$i<=1000;$i++) 
{ 
    $var = array(); 
    $var['booleon'] = true; 
} 
$total_array = microtime(true) - $ts_a; 

echo 'Object: ' . ($total_object) . '/Array: ' . $total_array; 

新結果:0.0037809 /陣列:0.0046189

有幾個測試,你會做那麼找到你的平均/模式在測試結束時找到真正更好的實體。

您可以通過執行memory_get_usagehttp://php.net/manual/en/function.memory-get-usage.php以相同的原則對內存進行測試。

+8

IMO性能考慮shoudnt將進入決定是否使用這一個或另一個。 – Gordon 2010-09-14 14:21:55

+1

寫給他們的測試。測試將它們傳遞給函數。測試通過引用傳遞並在函數內部修改它們(提示,不需要通過引用傳遞的對象在函數內部修改)。對於數組或對象來說,創建可能是最不經常的事情。誰在乎它們是否便宜,如果它們使用起來很昂貴...另外,你正在談論'1x10^-6'的區別......如果你擔心這個小小的收益,那麼你浪費你的時間。請記住,「過早優化是所有邪惡的根源......」 – ircmaxell 2010-09-14 14:33:14

+0

但是,一般情況下,性能是任何成功應用程序的重要組成部分,每當指示決策/實施時都應該解決! – RobertPitt 2010-09-14 14:34:34

5

你在做什麼?任何一種結構都不會更好,這就是爲什麼兩者都存在。所以這真的取決於你的問題集「更好」。即使如此,它可能只是你喜歡的一種情況。很多架構和代碼設計都是個人喜好和風格。

現在,一般來說,我只會使用一個方法更少的對象(stdclass,或一個自定義的對象)在數組上。這就是如果我需要傳遞大量數據並在多個地方進行修改的情況。對於一個數組,您需要通過引用來傳遞它,這會變得很麻煩,並且可能引入錯誤的來源...對於一個對象,默認情況下它會作爲對象引用傳遞(不是變量引用,而是指向相同的指針目的)。因此,對於陣列,您需要執行以下操作:

function doSomething($inVar, array &$inOutArray) { 
    $inOutArray['bar'] = 'baz'; 
} 

對於修改(或可能修改)數組的每個函數。

而用一個對象,你可以只是做:

function doSomething($inVar, $object) { 
    $object->bar = 'baz'; 
} 

這是短(當然,只有一個字符,但它是一個字符無處不在,你可能要修改數組)。它不太容易出現錯誤,因爲如果你以後做$object = new Something(),它不會更改原始對象(因爲它不是可變引用)...

唯一的參數是它的可讀性稍差,因爲&顯示您明確表示您打算修改該輸入變量。但是如果你明白PHP 5中的對象是如何工作的,那麼你不應該引起警惕(因此在我看來這是一個可接受的折衷)...