En utilisant SplObjectStorage comme carte de données, pouvez-vous utiliser un tableau mutable comme données?

StackOverflow https://stackoverflow.com/questions/9380430

Question

Dans le code suivant:

$storage = new \SplObjectStorage();

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

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

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

Je m'attendrais $storage[$fooA] être 1, ce qu'il est. Je m'attendrais aussi $storage[$fooB] être array('test'), ce que ce n'est pas. Cela déclenche également un avis qui se lit comme suit: "La modification indirecte de l'élément surchargé de SplobjectStorage n'a aucun effet dans ..."

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

Y a-t-il un moyen d'utiliser SplObjectStorage En tant que 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 type de travail?

Était-ce utile?

La solution

Modification indirecte (c.-à-d. offsetGet Retour d'une référence) est une capacité récente. Voir la note pour ArrayAccess::offsetGet. Il ne semble pas que SploBjectStorage en utilise (encore?).

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

$a = $storage[$fooB];
$a[] = 'test';
$storage[$fooB] = $a;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top