2012-02-21 3 views
6

Dans le code suivant:En utilisant SplObjectStorage comme carte de données, pouvez-vous utiliser un tableau modifiable comme donnée?

$storage = new \SplObjectStorage(); 

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

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

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

Je pense $storage[$fooA] d'être 1, qu'il est. Je m'attendrais également $storage[$fooB] à array('test'), ce qui n'est pas le cas. Cela déclenche également un avis qui lit, « modification indirecte de l'élément de surcharge SplObjectStorage n'a aucun effet ... »

Je pense que cela se produit parce que la mise en œuvre de ArrayAccess dans SplObjectStorage ne retourne pas les valeurs de référence.

Est-il possible d'utiliser SplObjectStorage comme une carte de données où les clés sont des objets et les valeurs sont des tableaux mutables? Y a-t-il d'autres options viables pour faire ce genre de travail?

Répondre

6

Une modification indirecte (c'est-à-dire offsetGet renvoyant une référence) est une capacité récente. Voir the note for ArrayAccess::offsetGet. Il ne semble pas que SplObjectStorage s'en serve (encore?).

Je vous suggère d'utiliser la modification directe à la place:

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