ArrayAccess, Iterator e SPL: Classes como array.

Parte muito interessante do PHP é a SPL. A Standart PHP Library veio para suprir varias necessidades de classes e interfaces úteis a qualquer sistema, como Classes para Array, iteradores, iteradores para sistemas de arquivos entre varios outros. E qual a real utilidade disso? Varias.

Agora, você pode ter um meio padrão para listar diretorios, sem funçoes que mais parecem gambiarras. Também trás melhores recursos para iteradores recursivos, por exemplo. E o titulo?

Como parte de SPL, têm duas classes que eu tenho usado em especial: ArrayAccess e Iterator.

Iterator é uma interface que permite que você itere(ande, avançe, se mova) em um objeto de forma básica, como se fosse um array mesmo. Normalmente fazer por exemplo foreach($obj as $property=>$value),  você navegaria pelos atributos definidos da classe. No caso do iterator, é um objeto que saber como fazer isso, de forma personalizada. Pode-se por exemplo definir um Iterator que ao invés de avançar pelos métodos do objeto passado, navegue por apenas elementos especificos, ou em uma propriedade que tenha uma lista. Enfim, basta usar a criatividade.

O ArrayAccess também é muito especial, esta interface permite o acesso a seu objeto como se fosse um array mesmo com "$obj[1]" ou mesmo "$obj[]". 

Existem outras também, que em outra oportunidade vou falar, mas essas eu estou em maior contato e aconselho a todos que usam PHP prestar alguma atênção a SPL, quem sabe não facilite sua vida um pouco.

Dito isto, eu tenho uma Classe, um tanto generica, chamada Collection. Ela, como o nome diz, é uma classe para lidar com listas, vetores e etc… Ela implementa estas duas interfaces, logo é capaz de se comportar com todos os recursos de um array, mais as vantagens de um Objeto. 

Na pagina da classe têm o arquivo de exemplo, onde podes ver alguns de seus usos. Eu pessoalmente uso em algo mais assim:

<?
class PageList extends Collection {
  function __construct() {
    $pageDAO = new PageDAO ;
    $pages = $pageDAO->select();
    $this->merge($pages);
  }
}
?>

Ou seja, eu posso em meu código usar apenas $pages = new PageList, e já vou ter um objeto totalmente manipulavel, iteravel e fazer coisas como foreach($pages as $page) ou while($page = $pages->fetch()) naturalmente e sem gambiarras.

Posso ainda sobrescrever os metodos add() e set() para ter maior controle sobre a coleção… novamente são muitas possibilidades.

Além, é claro, de ser útil para estudar ;) 

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>