Pergunta

Estou tentando estender o SPL ArrayObject, mas acertei um pequeno problema. Usando um ArrayObject não modificado, este código funciona:

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

Gendo esta saída:

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

        )
)

No entanto, se eu estender o ArrayObject e sobrecarregar o método Offsetget

class ExtendedArray extends ArrayObject {
    function offsetGet($i) {
        return parent::offsetGet($i);
    }
}

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

então falha assim:

ExtendedArray Object
(
    [storage:ArrayObject:private] => Array
        (
        )

)

O que é preciso para fazer minha aula prolongada funcionar com matrizes multidimensionais?

Foi útil?

Solução

Para mim, o snippet nº 1 está bastante quebrado, não o #2. Você está acessando um elemento que não existe, e o Código #2 fornece exatamente o que se esperaria: um aviso. A razão pela qual o #1 meio "funciona" é uma peculiaridade, ou duas peculiaridades do PHP. Primeiro, quando você aplica [] = operador no NULL, este nulo é "magicamente" se transformou em uma matriz - sem uma única palavra de aviso do intérprete.

$a = null;
$a[1] = 'foo'; // "works"
print_r($a); 

Segundo, isso (intencionalmente ou não) não se aplica aos nulos retornados de __get ou deslocamento.

class foo {
    function __get($s) { return null; }
}

$a = new foo;
$a->x[1] = 'foo'; // error
print_r($a);  

A mensagem de erro diz "Modificação indireta da propriedade sobrecarregada" e, o que quer que isso signifique, é uma coisa boa - você não tem permissão para modificar o valor nulo de forma alguma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top