Il logo del sito

PHP Manual

Classi ed interfacce predefinite

Traversable

Interfaccia per rivelare se una classe è attraversabile usando il costrutto foreach

Interfaccia base astratta, non può essere implementata da sola. Invece deve essere implementata per mezzo di IteratorAggregate o di Iterator.

Le classi interne (built-in) che implementano questa interfaccia possono essere usate in un costrutto foreach senza aver bisogno di implementare le interfacce Iterator o IteratorAggregate.

Questa è una interfaccia interna al motore di PHP che non può essere implementata negli scripts. Si possono invece implementare le interfacce IteratorAggregate o Iterator. Quando si implementa una interfaccia che estende Traversable, assicurarsi di elencare Iterator o IteratorAggregate prima del suo nome nella clausola implements.

Interface synopsis


Traversable {
}

Questa interfaccia non ha metodi, il suo solo scopo è quello di essere l'interfaccia base per tutte le classi traversable.

Traversable non può essere implemtata in uno script utente, ma può essere eseguito un test instanceof Traversable per capire se qualcosa può essere usato in uno costrutto foreach

Nota che sebbene gli oggetti e le array possano essere attraversate mediante un costrutto foreach, essi NON implementano Traversable, così NON PUOI usare instanceof Traversable per il controllo.

Infatti


<php
$giorniSettimana = array('lun', 'mar', 'mer', 'gio', 'ven', 'sab', 'dom');
class indirizzo {

    public $via;
    public $civ;
    public $cap;
    public $città;

   function __construct ($via, $civ, $cap, $città){
      $this->$via = $via;
      $this->$civ = $civ;
      $this->$cap = $cap;
      $this->$città = $città;
      echo nl2br("Istanziato nuovo indirizzo\n");
   }
   public function getIndirizzo(): string{
      return "Via ".$this->$via." nro ". $this->$civ." CAP ". $this->$cap. " ". $this->$città;
   }
}
if ($giorniSettimana instanceof Traversable){
   echo nl2br("L'array \$giorniSettimana è una istanza di Traversable\n");
}else{
   echo nl2br("L'array \$giorniSettimana NON è una istanza di Traversable\n");
}
$mioIndirizzo = new indirizzo('San Secondo', '175', '06024', 'Gubbio');

if ($mioIndirizzo instanceof Traversable){
   echo nl2br("L'oggetto \$mioIndirizzo è una istanza di Traversable\n");
}else{
   echo nl2br("L'oggetto \$mioIndirizzo NON è una istanza di Traversable\n");
}

?>
L'array $giorniSettimana NON è una istanza di Traversable
Istanziato nuovo indirizzo
L'oggetto $mioIndirizzo NON è una istanza di Traversable

Iterator

Interfaccia per la realizzazione id iteratori esterni o per oggetti iterabili internamente.

Estende Traversable

Definisce i seguenti metodi:

Esempio 01 - Implementazione di base

L'esempio mostra la definizione di una semplice classe che implementa l'interfaccia Iterator, quindi ne istanzia un oggetto ed itera su di esso tramite il costrutto foreach. Per ogni iterazione è visualizzata la sequenza dei metodi invocati.


<php
class myIterator implements Iterator{
   private $position =0;
   private $array = array('primo', 'secondo', 'terzo', 'quarto', 'quinto');
   public function __construct(){
      $this->position = 0;
   }
   public function rewind(){
      var_dump(__METHOD__);
      $this->position = 0;
   }
   public function key(){
      var_dump(__METHOD__);
      return $this->position;
   }
   public function next(){
      var_dump(__METHOD__);
      ++$this->position;
   }
   public function current(){
      var_dump(__METHOD__);
      return $this->array[$this->position];
   }
   public function valid(){
      var_dump(__METHOD__);
      return isset($this->array[$this->position]);
   }
} 
$it = new myIterator();
foreach ($it as $key=>$value){
   echo nl2br("\n");
   echo nl2br("key:".$key.", value: ". $value. "\n");
   echo nl2br("\n");
}  

?>
string(18) "myIterator::rewind" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key"
key:0, value: primo

string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key"
key:1, value: secondo

string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key"
key:2, value: terzo

string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key"
key:3, value: quarto

string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key"
key:4, value: quinto

string(16) "myIterator::next" string(17) "myIterator::valid"

Esempio 02 - Implementazione dell'interfaccia Iterator per array di qualunque tipo: associative (maps costituite da coppie key/value) e tradizionali con indice numerico.

Esempio 13 dell'utente RocketInABog at techno-monks dot net.


<php
class tIterator_array implements Iterator{
   private $myArray;
   public function __construct($givenArray){
      $this->myArray = $givenArray;
   }
   public function rewind(){
      reset($this->myArray);
   }
   public function key(){
      return key($this->myArray);
   }
   public function next(){
      next($this->myArray);
   }
   public function current(){
      return current($this->myArray);
   }
   public function valid(){
      return key($this->myArray)!== null;
   }
} 
$myArray= array("primo"=>"first", "secondo"=>"second","terzo"=>"third");
$it = new tIterator_array($myArray);
foreach ($it as $key=>$value){
   echo nl2br("\n");
   echo nl2br("key:".$key.", value: ". $value. "\n");
   echo nl2br("\n");
}  
?>

key:primo, value: first


key:secondo, value: second


key:terzo, value: third

IteratorAggregate

Throwable

ArrayAccess

Serializable

Closure

Generator

IteratorIterator

Questa classe consente di convertire qualsiasi oggetto Traversable in un Iterator. Dal momento che la maggior parte delle classi che non implementano Iterator hanno qualche buona ragione per farlo, è importante prendere precauzioni affinchè l'estensione a IteratorIterator non provochi qualche eccezione o errore fatale.>

implementa i seguenti metodi:

Esempio 01 - Implementazione di base