ArrayObject de PHP estendido não funciona corretamente
-
23-09-2019 - |
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?
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.