Objetos PHP como arrays falsos
Pergunta
Eu tenho um objeto que implementa ArrayAccess, Iterador e Contável.Isso produz um mascaramento de matriz quase perfeito.Posso acessá-lo com deslocamentos ($object[foo]
), posso jogá-lo em um foreach
-loop e muitas outras coisas.
Mas o que não posso fazer é entregá-lo às funções nativas do iterador do array (next()
, reset()
, current()
, key()
), embora eu tenha implementado os métodos necessários do Iterator.O PHP parece tentar teimosamente iterar através de suas variáveis de membro e desconsidera totalmente os métodos iteradores.
Existe uma interface que conectaria o objeto às funções restantes de passagem de array ou estou preso ao que tenho?
Atualizar: IteratorAggregate também não parece ser a resposta.Embora seja usado em foreach
-loops, as funções básicas do iterador de array não chamam os métodos.
Solução
Mudanças recentes no PHP evitam que o formulário ArrayIterators seja manipulado usando as funções padrão do array (reset, next, etc).
Isso deve ser restaurado em breve:http://news.php.net/php.internals/42015
Outras dicas
Uma maneira de fazer isso funcionar é definir seu próprio iterador em uma classe separada e, em seguida, dizer à sua classe principal para usar esse novo iterador em vez do padrão.
class MyIterator implements Iterator {
public function key() {
//
}
public function rewind() {
//
}
// etc.
}
class MyMainClass implements IteratorAggregate {
private $_data = array();
// getIterator is required for the IteratorAggregate interface.
public function getIterator() {
return new MyIterator($this->_data);
}
// etc.
}
Então você deve ter tanto controle quanto precisar.(E você pode reutilizar seu próprio MyIterator em várias classes).
Nenhum teste foi feito acima, mas o princípio está correto, acredito.
Espero que isto ajude!
É Iterador de Lista não é o que você está procurando?Ou que tal ArrayObject, que parece ser a interface do SPL para o que você está tentando alcançar.