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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top