En utilisant SplObjectStorage comme carte de données, pouvez-vous utiliser un tableau mutable comme données?
-
28-10-2019 - |
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?
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;