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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top