2016-03-01 26 views
1

我有一個包含以下一類:PHP返回參考陣列中的其他類

class TestClass { 
    protected $items = []; 

    public function toArray(){ 
     return $this->items; 
    } 

    // Items gets set using set(array $items){} 
} 

在另一類我稱之爲:

$tmpList = $list->toArray(); 

現在,如果我沒有記錯的話,這將創建一個全新的獨立數組,如果TestClass中的數組有100k個項目,則調用toArray()將創建另一個數組,其中包含另外100k個項目,用於兩個數組,總計200k個項目。

有沒有辦法讓我只返回TestClass中的條目的引用,所以我有一個100k條目的數組,而$tmpList只是引用這些條目?

如果我這樣做是爲了排序的數組,數組不會改變

$tmpList = $list->toArray(); 
usort($tmpList, function($a, $b) use ($orderBy, $direction){ 
    if($direction == 'desc'){ 
     return $b->$orderBy > $a->$orderBy; 
    }elseif($direction == 'asc'){ 
     return $b->$orderBy < $a->$orderBy; 
    } 
}); 

如果我追加此之後:

$list->set($tmpList); 

的數組被排序。

回答

2
$tmpList = &$list->toArray(); 

即使您應該測試真實的性能影響,因爲PHP在使用引用時會出現意想不到的情況。

更新:實際上,您似乎還必須在功能聲明的前面添加&。得到這部分錯誤。

public function &toArray(){ ... } 
+2

*表示*在PHP中與「內存優化」非常不同。 **不要使用這個,除非你的意思是允許兩個獨立的範圍_manipulate_相同的值。** – deceze

+0

我做了一個函數'protected function&arrayRef(){return $ this-> items;}'這個函數基本上做了同樣的事情,但是將它作爲參考返回並且使用了你的賦值方法。 –

+0

@GetOffMyLawn不要抱怨我,當你得到意想不到的副作用,但看到內存消耗沒有真正的區別... – deceze

3

不,它不會複製整個數組的內容。數組中的項目將通過引用進行處理。 PHP將在幕後對其進行優化。 PHP不是C,它沒有與C一樣的引用(指向內存位置的指針)。您無需擔心優化這一點。

+0

不是蘇爾。從http://php.net/manual/en/language.types.array.php我們有「數組分配總是涉及值複製。使用引用操作符通過引用複製數組。」 –

+0

@Luc *邏輯上。*這不是關於內存管理。 – deceze

+0

@deceze我不認爲這是真的......我有一個函數,將命令一個數組,如果我調用'toArray()',然後''usort'在數組上,它不會被排序。但是,如果我做同樣的事情,然後替換它得到排序的原始數組。 –