Extended PHP ArrayObject no funciona correctamente
-
23-09-2019 - |
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?
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