2012-02-21 25 views
6

En el siguiente código:Al usar SplObjectStorage como un mapa de datos, ¿puede usar una matriz mutable como datos?

$storage = new \SplObjectStorage(); 

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

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

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

Yo esperaría $storage[$fooA] para ser 1, que se encuentra. También esperaría que $storage[$fooB] fuera array('test'), que no lo es. Esto también provoca un aviso que dice: "modificación indirecta del elemento de sobrecarga de SplObjectStorage no tiene ningún efecto en ..."

creo que esto se debe a que la implementación de ArrayAccess en SplObjectStorage no devuelve valores de referencia.

¿Hay alguna forma de utilizar SplObjectStorage como un mapa de datos donde las claves son objetos y los valores son matrices mutables? ¿Hay alguna otra opción viable para hacer este tipo de trabajo?

Respuesta

6

La modificación indirecta (es decir, offsetGet devolviendo una referencia) es una habilidad reciente. Ver the note for ArrayAccess::offsetGet. No parece que SplObjectStorage lo use (¿todavía?).

le sugiero que utilice la modificación directa en su lugar:

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