2012-02-21 26 views
6

W poniższym kodzie:Używając SplObjectStorage jako mapy danych, czy możesz użyć tablicy zmiennych jako danych?

$storage = new \SplObjectStorage(); 

$fooA = new \StdClass(); 
$fooB = new \StdClass(); 

$storage[$fooA] = 1; 
$storage[$fooB] = array(); 

$storage[$fooA] = 2; 
$storage[$fooB][] = 'test'; 

spodziewałbym $storage[$fooA] być 1, co to jest. Oczekuję też, że $storage[$fooB] będzie array('test'), którego nie ma. To wyzwala również zawiadomienie, że czyta „Pośrednia zmiana przeciążonej element SplObjectStorage ma wpływ na ...”

myślę, że to się dzieje, ponieważ realizacja ArrayAccess w SplObjectStorage nie zwraca wartości przez odniesienie.

Czy istnieje sposób użycia SplObjectStorage jako mapy danych, gdzie klucze są obiektami, a wartości są tablicami, które można zmieniać? Czy są jakieś inne opłacalne opcje wykonywania tego rodzaju pracy?

Odpowiedz

6

Pośrednia modyfikacja (tj. offsetGet zwrócenie referencji) to ostatnia możliwość. Zobacz the note for ArrayAccess::offsetGet. Nie wydaje się, że SplObjectStorage z niego korzysta (jeszcze?).

Proponuję użyć bezpośrednią modyfikację Zamiast:

$a = $storage[$fooB]; 
$a[] = 'test'; 
$storage[$fooB] = $a;