Classi ed interfacce predefinite
- Interfaccia Traversable
- Interfaccia Iterator
- Interfaccia IteratorAggregate
- Interfaccia Throwable
- Interfaccia ArrayAccess
- Interfaccia Serializable
- Classe Closure
- Classe Generator
- Classe IteratorIterator
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");
}
?>
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:
- abstract public mixed current(void) - restituisce l'elemento corrente
- abstract public scalar key(void) - restituisce la key dell'elemento corrente
- abstract public void next(void) - sposta il puntatore sul prossimo elemento
- abstract public void rewind(void) - riposiziona il puntatore sul primo elemento
- abstract public boolean valid(void)- indica se il puntatore è punta ad una posizione valida
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");
}
?>
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:
- public __construct(Traversable $iterator) - crea un iteratore da qualunque cosa sia traversable
- public mixed current(void) - l'elemento corrente
- public Traversable getInnerIterator(void) - restituisce l'iteratore interno
- public scalar key(void) - restituisce la key dell'elemento corrente
- public void next(void) - sposta il puntatore sul prossimo elemento
- public void rewind(void) - riposiziona il puntatore sul primo elemento
- public boolean valid(void)- indica se il puntatore è punta ad una posizione valida