Iteración de objetos en PHP 7

Las matrices PHP son la estructura de recopilación más frecuente utilizada en PHP. Podemos exprimir casi cualquier cosa en una matriz, desde valores escalares hasta objetos. Iterar a través de elementos de tal estructura es trivialmente fácil usando la declaración foreach. Sin embargo, las matrices no son los únicos tipos iterables, ya que los objetos mismos son iterables.

Echemos un vistazo al siguiente ejemplo basado en matriz:

<?php
$user = [
'name' => 'John',
'age' => 34,
'salary' => 4200.00
];
foreach ($user as $k => $v) {
echo "key: $k, value: $v" . PHP_EOL;
}

Ahora echemos un vistazo al siguiente ejemplo basado en objetos:

<?php
class User
{
public $name = 'John';
public $age = 34;
public $salary = 4200.00;
}
$user = new User();
foreach ($user as $k => $v) {
echo "key: $k, value: $v" . PHP_EOL;
}

Ejecutado en la consola, ambos ejemplos producirían un resultado idéntico:

key: name, value: John
key: age, value: 34
key: salary, value: 4200

Por defecto, la iteración solo funciona con propiedades públicas, excluyendo cualquier propiedad privada o protegida de la lista.
PHP proporciona una interfaz Iterator, que permite especificar qué valores queremos que estén disponibles para iterar.

Iterator extends Traversable {
abstract public mixed current(void)
abstract public scalar key(void)
abstract public void next(void)
abstract public void rewind(void)
abstract public boolean valid(void)
}

El siguiente ejemplo demuestra una implementación simple de la interfaz Iterator:

<?php
class User implements \Iterator
{
public $name = 'John';
private $age = 34;
protected $salary = 4200.00;
private $info = [];
public function __construct()
{
$this->info = [
'name' => $this->name,
'age' => $this->age,
'salary' => $this->salary
];
}
public function current()
{
return current($this->info);
}
public function next()
{
return next($this->info);
}
public function key()
{
return key($this->info);
}
public function valid()
{
$key = key($this->info);
return ($key !== null && $key !== false);
}
public function rewind()
{
return reset($this->info);
}
}

Con esta implementación, ahora aparentemente podemos iterar sobre las propiedades privadas y protegidas de la clase User. Aunque, este no es realmente el caso. Lo que sucede es que, a través del constructor, la clase está llenando el parámetro $info con los datos de todas las demás propiedades que deseamos iterar. Los métodos obligatorios de la interfaz aseguran que nuestra clase juegue bien con la construcción foreach.

La iteración de objetos es una característica ordenada, aunque a menudo pasada por alto de PHP cuando se trata del desarrollo diario.

Comparte