Aqui está um exemplo prático que demonstra como um iterador pode ser útil em um cenário real. Vamos criar um iterador simples para ler e processar linhas de um arquivo grande sem carregar todo o arquivo na memória.
Suponha que você tenha um arquivo de log muito grande chamado "large_log.txt". Em vez de ler o arquivo inteiro de uma vez, usaremos um iterador para ler e processar linha por linha:
class LogFileIterator implements Iterator {
private $file;
private $currentLine;
private $position = 0;
public function __construct($filename) {
$this->file = fopen($filename, 'r');
}
public function rewind() {
rewind($this->file);
$this->position = 0;
$this->currentLine = fgets($this->file);
}
public function current() {
return $this->currentLine;
}
public function key() {
return $this->position;
}
public function next() {
$this->position++;
$this->currentLine = fgets($this->file);
}
public function valid() {
return false !== $this->currentLine;
}
public function __destruct() {
if ($this->file) {
fclose($this->file);
}
}
}
// Usando o iterador para processar o arquivo de log
$iterator = new LogFileIterator('large_log.txt');
foreach ($iterator as $line) {
// Processar cada linha do arquivo de log
echo $line;
}
Neste exemplo, a classe LogFileIterator
é um iterador personalizado que lê e processa o arquivo de log linha por linha. Ele evita a necessidade de carregar todo o arquivo na memória e permite que você processe grandes arquivos de log de forma eficiente.
O método __destruct
garante que o arquivo seja fechado adequadamente quando o iterador não for mais necessário.
Esse é um exemplo simples de como um iterador pode ser útil em um cenário real, mas em situações mais complexas, você pode personalizar o iterador de acordo com as necessidades específicas de seu projeto.