Recursos do PHP: as interfaces nativas, parte 2
Continuação do post anterior sobre interfaces nativas do PHP.
Iterator
Definição segundo a documentação do PHP:
Interface para iteradores externos ou objetos poderem ser iterados por eles mesmos internamente.
Com a interface Iterator
é possível percorrer o objeto através de laços de repetição, ou seja, o objeto se torna iterável. Para isso, é necessário implementar os métodos que irão definir a posição durante a iteração.
<?php
/**
*
* Exemplo de implementação da interface iterator
* @author Raphael da Silva
*
*
*/
class ColecaoDeNomes implements Iterator
{
private $nomes = [];
private $posicao = 0;
public function adicionarNome($nome): void
{
$this->nomes[] = $nome;
}
/**
*
* Os métodos abaixo são parte da interface Iterator.
*
*/
public function current()
{
return $this->nomes[$this->posicao];
}
public function key()
{
return $this->posicao;
}
public function next(): void
{
$this->posicao++;
}
public function rewind(): void
{
$this->posicao = 0;
}
public function valid(): bool
{
return isset($this->nomes[$this->posicao]);
}
}
Com a implementação da interface concluída, é possível iterar no objeto como se o mesmo fosse um array.
<?php
$nomes = new ColecaoDeNomes;
$nomes->adicionarNome('Raphael');
$nomes->adicionarNome('Bruno');
//Com a interface dá para usar o feachr direto no objeto.
foreach($nomes as $nome){
echo $nome, PHP_EOL;
}
Relembrando o que é uma iteração
Iteração é termo usado para se referir ao ato de repetir uma ação no código. Basicamente, iterar é repetir uma instrução através de um laço repetição (loop).
IteratorAggregate
Definição segundo a documentação do PHP:
Interface para criar um Iterator externo.
O objetivo da interface IteratorAggregate
é definir um iterator em um objeto que não deve ser um iterator, mas por algum motivo é útil ter um interator atrelado (aka agregado) a ele. O exemplo a seguir mostra o propósito da interface, onde a única parte que é iterável é retornada através do método getIterator
.
<?php
/**
*
* Exemplo de implementação de IteratorAggregate
* @author Raphael da Silva
*
*/
class InformacoesDeLivros implements IteratorAggregate
{
private $nomesDeLivros;
public function __construct(array $nomesLivros)
{
$this->nomesDeLivros = $nomesDeLivros;
}
public function getIterator(): Iterator
{
$nomes = new ColecaoDeNomes;
foreach($this->nomesDeLivros as $livro){
$nomes->adicionarNome($livro);
}
return $nomes;
}
}
Basicamente, a ideia do IteratorAggregate
é fornecer um objeto que têm um iterator e não que é um iterator, por isso o uso da palavra aggregate para dar a ideia de ter (ou agregar) algo. No exemplo em questão, a classe InformacoesDeLivros
agraga o interagir ColecaoDeNomes
que foi usado como exemplo anterior.
ver todos os posts