2010-02-27 4 views
2

J'essaie d'étendre le SPL ArrayObject mais j'ai rencontré un petit problème. L'utilisation d'un ArrayObject non modifié, ce code fonctionne:ArrayObject PHP étendu ne fonctionne pas correctement

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

qui donne cette sortie:

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

     ) 
) 

Toutefois, si je tends ArrayObject et de surcharge la méthode 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 faire pour que ma classe étendue fonctionne avec des tableaux multidimensionnels?

Répondre

1

Pour moi, l'extrait n ° 1 est plutôt cassé, pas le n ° 2. Vous accédez à un élément qui n'existe pas, et le code n ° 2 vous donne exactement ce à quoi on s'attendrait: un avertissement. La raison pour laquelle # 1 fonctionne "un peu" est une bizarrerie, ou deux bizarreries de php. Tout d'abord, lorsque vous appliquez [] = operator sur null, ce null est "magiquement" transformé en tableau - sans un seul mot d'avertissement de la part de l'interpréteur. Deuxièmement, ceci (intentionnellement ou non) ne s'applique pas aux valeurs null retournées par __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 façon.

Questions connexes