Obiecte iterabile în PHP
O valoare iterabilă în PHP este orice valoare pe care o poți parcurge cu o buclă foreach().
PHP 7.1 a adăugat iterable ca pseudo-tip, pe care îl poți folosi pentru argumentele funcțiilor și pentru valorile returnate.
Se încadrează două feluri de valori: tablourile și obiectele care implementează interfața Iterator.
PHP - Folosirea valorilor iterabile
Scrie iterable ca tip al unui parametru de funcție sau ca tip returnat de funcție:
Exemplu
O funcție care acceptă un parametru iterabil, apelată o dată cu un tablou și o dată cu un obiect:
Ieșire: script PHP
<?php
function printIterable(iterable $x) {
foreach($x as $item) {
echo $item;
}
}
// Apelată cu un tablou:
printIterable(["a", "b", "c"]);
// Apelată cu un obiect:
$iterator = new ArrayIterator(["d", "e", "f"]);
printIterable($iterator);
?>
Exemplu
O funcție al cărei tip returnat este iterabil:
Ieșire: script PHP
<?php
function getIterable():iterable {
return ["a", "b", "c"];
}
foreach(getIterable() as $item) {
echo $item;
}
?>
PHP - Crearea valorilor iterabile
Orice tablou este iterabil, așa că poți transmite orice tablou unei funcții care așteaptă o valoare iterabilă.
La fel și cu obiectele: orice obiect care implementează Iterator este acceptat și el.
Un iterator păstrează o listă de elemente și îți oferă metode pentru a te deplasa prin ele. Menține un pointer pe câte un element al listei, iar fiecare element ar trebui să aibă o cheie care poate fi folosită pentru a-l localiza.
Iteratorul tău trebuie să definească aceste cinci metode:
current()- Returnează elementul aflat sub pointer, care poate fi de orice tip de datekey()- Returnează cheia elementului curent, care poate fi doar un număr întreg, un număr zecimal, o valoare booleană sau un șir de caracterenext()- Avansează pointerul cu un elementrewind()- Readuce pointerul la primul elementvalid()- Returnează true atât timp cât pointerul intern se află pe un element. Ar trebui să returneze false când pointerul nu se află pe niciun element, de exemplu după cenext()a fost apelată la sfârșitul listei
Exemplu
Aici, o clasă implementează Iterator, iar obiectul ei este apoi transmis unei funcții ca valoare iterabilă:
Ieșire: script PHP
<?php
// Creăm un Iterator
class MyIterator implements Iterator {
private $items = [];
private $pointer = 0;
public function __construct($items) {
// array_values() se asigură că cheile sunt numere
$this->items = array_values($items);
}
public function current() {
return $this->items[$this->pointer];
}
public function key() {
return $this->pointer;
}
public function next() {
$this->pointer++;
}
public function rewind() {
$this->pointer = 0;
}
public function valid() {
// count() indică numărul de elemente din listă
return $this->pointer < count($this->items);
}
}
// O funcție care folosește valori iterabile
function printIterable(iterable $myIterable) {
foreach($myIterable as $item) {
echo $item;
}
}
// Folosim iteratorul ca valoare iterabilă
$iterator = new MyIterator(["a", "b", "c"]);
printIterable($iterator);
?>