Pregunta

En el siguiente código:

$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] ser - estar 1, cual es. También esperaría $storage[$fooB] ser - estar array('test'), que no es. Esto también desencadena un aviso que dice: "La modificación indirecta del elemento sobrecargado de Splobjectstorage no tiene ningún efecto en ..."

Creo que esto sucede porque la implementación de ArrayAccess en SplObjectStorage no devuelve los valores por referencia.

¿Hay alguna forma de usar SplObjectStorage como un mapa de datos donde las claves son objetos y valores son matrices mutables? ¿Hay otras opciones viables para hacer este tipo de trabajo?

¿Fue útil?

Solución

Modificación indirecta (es decir offsetGet devolver una referencia) es una habilidad reciente. Ver la nota para ArrayAccess::offsetGet. No parece que Splobjectstorage lo use (¿todavía?).

Sugiero que use la modificación directa en su lugar:

$a = $storage[$fooB];
$a[] = 'test';
$storage[$fooB] = $a;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top