Extended PHP ArrayObject ne fonctionne pas correctement
-
23-09-2019 - |
Question
Je suis en train d'étendre le SPL ArrayObject mais je l'ai touché un peu accroc. L'utilisation d'un ArrayObject non modifié, ce code fonctionne:
$a = new ArrayObject();
$a[1][2] = 'abc';
print_r($a);
qui donne cette sortie:
ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[1] => Array
(
[2] => abc
)
)
)
Cependant, si j'adresse ArrayObject et de la surcharge de la méthode de offsetGet
class ExtendedArray extends ArrayObject {
function offsetGet($i) {
return parent::offsetGet($i);
}
}
$a = new ExtendedArray();
$a[1][2] = 'abc';
print_r($a);
il échoue comme ceci:
ExtendedArray Object
(
[storage:ArrayObject:private] => Array
(
)
)
Que faut-il pour faire mon travail de classe étendue avec des tableaux multidimensionnels?
La solution
Pour moi, l'extrait # 1 est plutôt cassé, pas le # 2. Vous accédez un élément qui n'existe pas, et le code # 2 vous donne exactement ce que l'on pouvait s'y attendre: un avertissement. La raison pour laquelle # 1 un peu « fonctionne » est une bizarrerie ou deux bizarreries de php. Tout d'abord, lorsque vous appliquez [] = opérateur null, null est cette « magie » transformé en un tableau - sans un seul mot d'avertissement d'interprète.
$a = null;
$a[1] = 'foo'; // "works"
print_r($a);
En second lieu, ce (intentionnellement ou non) ne concerne pas les valeurs NULL de retour __get ou offsetGet.
class foo {
function __get($s) { return null; }
}
$a = new foo;
$a->x[1] = 'foo'; // error
print_r($a);
le message d'erreur « modification indirecte de la propriété surchargée », et, quoi que cela signifie, il est une bonne chose -. Vous n'êtes pas autorisé à modifier la valeur nulle de quelque manière que