Pregunta

Estoy tratando de extender el SPL ArrayObject pero he golpeado un pequeño inconveniente. El uso de un ArrayObject no modificada, este código funciona:

$a = new ArrayObject();
$a[1][2] = 'abc';
print_r($a);

produciendo esta salida:

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [1] => Array
                (
                    [2] => abc
                )

        )
)

Sin embargo, si extiendo ArrayObject y sobrecarga el método offsetGet

class ExtendedArray extends ArrayObject {
    function offsetGet($i) {
        return parent::offsetGet($i);
    }
}

$a = new ExtendedArray();
$a[1][2] = 'abc';
print_r($a);

A continuación, no como esto:

ExtendedArray Object
(
    [storage:ArrayObject:private] => Array
        (
        )

)

¿Qué se necesita para hacer mi trabajo de la clase extendida con matrices multidimensionales?

¿Fue útil?

Solución

Para mí, el fragmento # 1 es bastante roto, no el # 2. Usted está accediendo a un elemento que no existe, y el código # 2 le da exactamente lo que uno esperaría: una advertencia. La razón por la # 1 un poco "funciona" es un capricho, o dos peculiaridades de php. En primer lugar, cuando se aplica [] = operador nulo, esto es nula "mágicamente" se convirtió en una gran variedad - sin una sola palabra de advertencia del intérprete.

$a = null;
$a[1] = 'foo'; // "works"
print_r($a); 

Segundo, este (intencionalmente o no) no se aplica a los valores nulos de regresar de __get o offsetGet.

class foo {
    function __get($s) { return null; }
}

$a = new foo;
$a->x[1] = 'foo'; // error
print_r($a);  

el mensaje de error dice "modificación indirecta de la propiedad sobrecargada", y, sea lo que sea, es una buena cosa -. No está permitido modificar el valor nulo de ninguna manera

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top