Estesa PHP ArrayObject non funziona correttamente
-
23-09-2019 - |
Domanda
Sto cercando di estendere la SPL ArrayObject ma ho colpito un piccolo intoppo. L'utilizzo di un ArrayObject non modificato, questo codice funziona:
$a = new ArrayObject();
$a[1][2] = 'abc';
print_r($a);
cedevole questo output:
ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[1] => Array
(
[2] => abc
)
)
)
Tuttavia, se estendo ArrayObject e sovraccaricare il metodo di offsetGet
class ExtendedArray extends ArrayObject {
function offsetGet($i) {
return parent::offsetGet($i);
}
}
$a = new ExtendedArray();
$a[1][2] = 'abc';
print_r($a);
poi non riesce in questo modo:
ExtendedArray Object
(
[storage:ArrayObject:private] => Array
(
)
)
Che cosa ci vuole per fare il mio lavoro di classe estesa con array multidimensionali?
Soluzione
Per quanto mi riguarda, il frammento # 1 è piuttosto rotto, non il # 2. Stai accedendo un elemento che non esiste, e il codice # 2 ti dà esattamente quello che ci si aspetterebbe: un avvertimento. Il motivo per cui # 1 po ' "funziona" è un capriccio, o due capricci di php. In primo luogo, quando si applica [] = operatore null, questo nulla è "magicamente" trasformato in un array - senza singola parola di avvertimento da interprete.
$a = null;
$a[1] = 'foo'; // "works"
print_r($a);
In secondo luogo, questo (intenzionalmente o no) non si applica ai valori nulli tornato da __get o offsetGet.
class foo {
function __get($s) { return null; }
}
$a = new foo;
$a->x[1] = 'foo'; // error
print_r($a);
il messaggio di errore dice "modifica indiretta della proprietà sovraccarico", e, qualunque cosa significhi, è una buona cosa -. Non ti è permesso di modificare il valore nullo in alcun modo