Utilizzando SPLObjectStorage come mappa dei dati, puoi utilizzare un array mutabile come dati?
-
28-10-2019 - |
Domanda
Nel seguente codice:
$storage = new \SplObjectStorage();
$fooA = new \StdClass();
$fooB = new \StdClass();
$storage[$fooA] = 1;
$storage[$fooB] = array();
$storage[$fooA] = 2;
$storage[$fooB][] = 'test';
Mi aspetterei $storage[$fooA]
essere 1
, che è. Mi aspetterei anche $storage[$fooB]
essere array('test')
, cosa che non è. Ciò innesca anche un avviso che recita: "La modifica indiretta dell'elemento sovraccarico di SplObjectStorage non ha alcun effetto in ..."
Penso che ciò accada perché l'implementazione di ArrayAccess
in SplObjectStorage
non restituisce i valori per riferimento.
C'è un modo per usare SplObjectStorage
Come mappa dei dati in cui le chiavi sono oggetti e valori sono array mutabili? Ci sono altre opzioni praticabili per fare questo tipo di lavoro?
Soluzione
Modifica indiretta (cioè offsetGet
Restituire un riferimento) è un'abilità recente. Vedere la nota per ArrayAccess::offsetGet
. Non sembra che splObjectStorage ne faccia uso (ancora?).
Ti suggerisco invece di usare la modifica diretta:
$a = $storage[$fooB];
$a[] = 'test';
$storage[$fooB] = $a;