Iteracion de Objetos
PHP 5 provee una manera para objetos para ser definidos de manera que es posible iterar a traves de una lista de items con, por ejemplo, una declaracion foreach. Por defecto, las propiedades visibles seran usadas por esta iteracion.
PHP 5 provides a way for objects to be defined so it is possible to iterate through a list of items, with, for example a foreach statement. By default, all visible properties will be used for the iteration.Lo acomode como pude. Aca necesito una mano.
Ejemplo 19-20. Simple Iteracion de Object Código PHP:
<?php
class MiClase
{
public $var1 = 'valor 1';
public $var2 = 'valor 2';
public $var3 = 'valor 3';
protected $protegida = 'variable protegida';
private $privada = 'variable privada';
function iteracionVisible() {
echo "MiClase::iteracionVisible:\n";
foreach($this as $key => $value) {
print "$key => $value\n";
}
}
}
$clase = new MiClase();
foreach($clase as $key => $value) {
print "$key => $value\n";
}
echo "\n";
$clase->iteracionVisible();
?>
El ejemplo anterior tendra la siguiente salida:
Cita: var1 => valor 1
var2 => valor 2
var3 => valor 3
MiClase::iteracionVisible:
var1 => valor 1
var2 => valor 2
var3 => valor 3
protected => variable protegida
private => variable privada
Como muestra la salida de este script, a travez del foreach se han interado todas las variables visibles que pueden ser accedidas. Para realizar un paso mas avanzado, se puede implementar una funcion internar de PHP denominada interface de Iterador. Esta funcion permite al objeto decidir que y como el objeto sera iterado.
As the output shows, the foreach iterated through all visible variables that can be accessed. To take it a step further you can implement one of PHP 5's internal interface named Iterator. This allows the object to decide what and how the object will be iterated.
Ejemplo 19-21. Iteracion de Objeto implementando Iterador Código PHP:
<?php
class MiIterador implements Iterator
{
private $var = array();
public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
}
public function rewind() {
echo "rewinding\n";
reset($this->var);
}
public function current() {
$var = current($this->var);
echo "current: $var\n";
return $var;
}
public function key() {
$var = key($this->var);
echo "key: $var\n";
return $var;
}
public function next() {
$var = next($this->var);
echo "next: $var\n";
return $var;
}
public function valid() {
$var = $this->current() !== false;
echo "valid: {$var}\n";
return $var;
}
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $a => $b) {
print "$a: $b\n";
}
?>
La salida será:
Cita: rewinding
current: 1
valid: 1
current: 1
key: 0
0: 1
next: 2
current: 2
valid: 1
current: 2
key: 1
1: 2
next: 3
current: 3
valid: 1
current: 3
key: 2
2: 3
next:
current:
valid:
Tambien se puede definir la clase ...
You can also define your class so that it doesn't have to define all the Iterator functions by simply implementing the PHP 5 IteratorAggregate interface.