قابل تکرارها (Iterables)
«قابل تکرار (Iterable)» یعنی مقداری که با حلقه foreach() می چرخد. از PHP 7.1، نوع شبه داده iterable را می توان برای ورودی و خروجی توابع نوشت.
استفاده از iterable به عنوان ورودی
این تابع هر چیزی که قابل تکرار باشد را می پذیرد و چاپ می کند.
<?php
function printIterable(iterable $myIterable) {
foreach ($myIterable as $item) {
echo $item;
}
}
$arr = ["a", "b", "c"];
printIterable($arr);
?>
برگرداندن iterable از تابع
می توان خروجی تابع را هم iterable تعیین کرد و بعد حلقه زد.
<?php
function getIterable(): iterable {
return ["a", "b", "c"];
}
$myIterable = getIterable();
foreach ($myIterable as $item) {
echo $item;
}
?>
ساخت قابل تکرار با Iterator
هر شیئی که Iterator را پیاده سازی کند قابل تکرار است. این کلاس اشاره گر داخلی دارد.
<?php
// ساخت یک Iterator
class MyIterator implements Iterator {
private $items = [];
private $pointer = 0;
public function __construct($items) {
$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() {
return $this->pointer < count($this->items);
}
}
// تابعی که iterable می گیرد
function printIterable(iterable $myIterable) {
foreach ($myIterable as $item) {
echo $item;
}
}
// استفاده از Iterator به عنوان iterable
$iterator = new MyIterator(["a", "b", "c"]);
printIterable($iterator);
?>
گام های عملی
- تابع با ورودی
iterableبنویس. - یک آرایه بده و خروجی را ببین.
- کلاس
Iteratorپیاده سازی کن. - شیء Iterator را به تابع بده.
برای مباحث مرتبط، بخش فضاهای نام و همچنین اینترفیس ها را ببین. قابل تکرارها در پروژه های واقعی بسیار به درد می خورند.
جمع بندی سریع
iterableبرای ورودی و خروجی مفید است.- آرایه ها همیشه قابل تکرار هستند.
- هر
Iteratorیک iterable است. - حلقه
foreachساده و خواناست.