可能重複:
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';
可能重複:
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';
陣列
array_*
功能,可以在陣列中,其中大部分是非常快的工作。對象
__get
,__set
等)只需運行一個簡單的測試:
$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_usage
:http://php.net/manual/en/function.memory-get-usage.php以相同的原則對內存進行測試。
IMO性能考慮shoudnt將進入決定是否使用這一個或另一個。 – Gordon 2010-09-14 14:21:55
寫給他們的測試。測試將它們傳遞給函數。測試通過引用傳遞並在函數內部修改它們(提示,不需要通過引用傳遞的對象在函數內部修改)。對於數組或對象來說,創建可能是最不經常的事情。誰在乎它們是否便宜,如果它們使用起來很昂貴...另外,你正在談論'1x10^-6'的區別......如果你擔心這個小小的收益,那麼你浪費你的時間。請記住,「過早優化是所有邪惡的根源......」 – ircmaxell 2010-09-14 14:33:14
但是,一般情況下,性能是任何成功應用程序的重要組成部分,每當指示決策/實施時都應該解決! – RobertPitt 2010-09-14 14:34:34
你在做什麼?任何一種結構都不會更好,這就是爲什麼兩者都存在。所以這真的取決於你的問題集「更好」。即使如此,它可能只是你喜歡的一種情況。很多架構和代碼設計都是個人喜好和風格。
現在,一般來說,我只會使用一個方法更少的對象(stdclass
,或一個自定義的對象)在數組上。這就是如果我需要傳遞大量數據並在多個地方進行修改的情況。對於一個數組,您需要通過引用來傳遞它,這會變得很麻煩,並且可能引入錯誤的來源...對於一個對象,默認情況下它會作爲對象引用傳遞(不是變量引用,而是指向相同的指針目的)。因此,對於陣列,您需要執行以下操作:
function doSomething($inVar, array &$inOutArray) {
$inOutArray['bar'] = 'baz';
}
對於修改(或可能修改)數組的每個函數。
而用一個對象,你可以只是做:
function doSomething($inVar, $object) {
$object->bar = 'baz';
}
這是短(當然,只有一個字符,但它是一個字符無處不在,你可能要修改數組)。它不太容易出現錯誤,因爲如果你以後做$object = new Something()
,它不會更改原始對象(因爲它不是可變引用)...
唯一的參數是它的可讀性稍差,因爲&
顯示您明確表示您打算修改該輸入變量。但是如果你明白PHP 5中的對象是如何工作的,那麼你不應該引起警惕(因此在我看來這是一個可接受的折衷)...
爲什麼你說1比2好?我個人不同意這種說法。你能解釋爲什麼你認爲1比2好?我們在談論效率,內存消耗,編碼實踐嗎?看看:http://particletree.com/notebook/object-oriented-php-memory-concerns/也。 – Chris 2010-09-14 14:03:27
只是提示:也許陣列消耗更少的資源。 – fabrik 2010-09-14 14:03:28
@Chris:我想我在某處讀到,如果你需要一個結構來存儲數據,那麼1是首選的方法。 – 2010-09-14 14:06:53