2011-08-04 12 views

Respuesta

3

Ejemplo para extender un iterador:

class Foo extends ArrayIterator 
{ 
    public function valid() { 
     $result = parent::valid(); 

     if (!$result) { 
      echo 'after'; 
     } 

     return $result; 
    } 
} 

$x = new Foo(array(1, 2, 3)); 

echo 'before'; 
foreach ($x as $y) { 
    echo $y; 
} 

// output: before123after 
+0

mientras eso funciona, está sucio hacerlo porque el método válido tiene efectos secundarios ahora. Ver mi respuesta para un enfoque más limpio. – Gordon

+0

@Gordon Estás en lo correcto. OP debe elegir el método que ha mostrado. – Yoshi

2
function valid(){ 
    $isValid=...; 
    if(!$isValid) 
     doStuff(); 
    return $isValid; 
} 
3

Extendiendo un iterador sobrecargar valid() no es un buen enfoque porque está agregando funcionalidad en válido() que no pertenece allí. Un enfoque algo más limpio sería utilizar:

class BeforeAndAfterIterator extends RecursiveIteratorIterator 
{ 
    public function beginIteration() 
    { 
     echo 'begin'; 
    } 
    public function endIteration() 
    { 
     echo 'end'; 
    } 
} 

y luego hacer

$it = new BeforeAndAfterIterator(new RecursiveArrayIterator(range(1,10))); 
foreach($it as $k => $v) { 
    echo "$k => $v"; 
} 

la que luego daría

begin0 => 11 => 22 => 33 => 44 => 55 => 66 => 77 => 88 => 99 => 10end 

Esos dos métodos están bien a la sobrecarga ya que son específicamente para ese propósito y no tienen un comportamiento predefinido (tenga en cuenta que no estoy llamando al método principal).

Cuestiones relacionadas