PHP Iterables

در PHP، iterable (قابل تکرار) به هر ساختاری گفته میشود که بتوان آن را با foreach
پیمایش کرد. یک iterable میتواند یک آرایه یا یک شیء باشد که رابط Traversable را پیادهسازی کرده است (مانند Iterator یا Generator).
۱. تعریف نوع iterable در توابع
از نسخه PHP 7.1، میتوان از نوع iterable
در توابع استفاده کرد تا هم آرایهها و هم اشیایی که Traversable
را پیادهسازی میکنند، پذیرفته شوند.
مثال:
function printIterable(iterable $items): void {
foreach ($items as $item) {
echo $item . PHP_EOL;
}
}
$arr = [1, 2, 3, 4];
printIterable($arr);
۲. بازگرداندن یک مقدار iterable از تابع
یک تابع میتواند مقدار iterable
بازگرداند:
function getNumbers(): iterable {
return [10, 20, 30, 40];
}
foreach (getNumbers() as $num) {
echo $num . PHP_EOL;
}
۳. استفاده از Generator برای بهینهسازی حافظه
Generator با استفاده از yield
، مقداردهی را بهصورت تنبل (lazy) انجام میدهد و در مصرف حافظه بهینهتر است:
function generateNumbers(): iterable {
for ($i = 1; $i <= 5; $i++) {
yield $i;
}
}
foreach (generateNumbers() as $num) {
echo $num . PHP_EOL;
}
۴. استفاده از Traversable و Iterator
Traversable
یک رابط (interface) پایه برای اشیایی است که میتوان آنها را در foreach
پیمایش کرد. پیادهسازیهای رایج شامل موارد زیر است:
Iterator
IteratorAggregate
مثال: پیادهسازی Iterator
class MyIterator implements Iterator {
private $items = [“A”, “B”, “C”];
private $index = 0;
public function current() { return $this->items[$this->index]; }
public function key() { return $this->index; }
public function next() { $this->index++; }
public function rewind() { $this->index = 0; }
public function valid() { return isset($this->items[$this->index]); }
}
$it = new MyIterator();
foreach ($it as $key => $value) {
echo “$key: $value\n”;
}
۵. استفاده از IteratorAggregate
به جای پیادهسازی Iterator
، میتوان از IteratorAggregate
استفاده کرد که تنها نیاز به تعریف یک متد دارد: getIterator()
.
class MyCollection implements IteratorAggregate {
private $data = [“X”, “Y”, “Z”];
public function getIterator(): Traversable {
return new ArrayIterator($this->data);
}
}
$collection = new MyCollection();
foreach ($collection as $item) {
echo $item . PHP_EOL;
}
خلاصه
✅ iterable
به معنی دادههایی است که قابل پیمایش در foreach
هستند.
✅ Generators (yield
) برای پردازش دادههای بزرگ بدون مصرف زیاد حافظه کاربرد دارند.
✅ Iterator امکان ساخت اشیای سفارشی برای پیمایش را فراهم میکند.
✅ IteratorAggregate
یک روش سادهتر برای ایجاد اشیای قابل پیمایش است.
دیدگاهتان را بنویسید