The IteratorAggregate interface helps you make your objects easy to loop over with foreach. It tells PHP how to get an iterator for your object.
IteratorAggregate interface in PHP
class ClassName implements IteratorAggregate { public function getIterator(): Traversable { // return an iterator object here } }
The getIterator() method must return an object that implements Traversable, usually an ArrayIterator.
This interface makes your object compatible with foreach loops.
<?php class MyCollection implements IteratorAggregate { private array $items = []; public function __construct(array $items) { $this->items = $items; } public function getIterator(): Traversable { return new ArrayIterator($this->items); } } $collection = new MyCollection(['apple', 'banana', 'cherry']); foreach ($collection as $item) { echo $item . "\n"; }
<?php class NumberRange implements IteratorAggregate { private int $start; private int $end; public function __construct(int $start, int $end) { $this->start = $start; $this->end = $end; } public function getIterator(): Traversable { return new ArrayIterator(range($this->start, $this->end)); } } $range = new NumberRange(1, 3); foreach ($range as $number) { echo $number . "\n"; }
This program creates a shopping list object that can be looped over with foreach to print each item.
<?php class ShoppingList implements IteratorAggregate { private array $items; public function __construct(array $items) { $this->items = $items; } public function getIterator(): Traversable { return new ArrayIterator($this->items); } } $list = new ShoppingList(['milk', 'bread', 'eggs']); foreach ($list as $item) { echo "Buy: $item\n"; }
You can return any iterator from getIterator(), not just ArrayIterator.
Implementing IteratorAggregate is simpler than Iterator if you just want to provide an iterator.
The IteratorAggregate interface lets your object be used in foreach loops.
You must implement getIterator() to return an iterator.
This helps separate data storage from how you loop through data.
Practice
What is the main purpose of the IteratorAggregate interface in PHP?
Solution
Step 1: Understand the role of IteratorAggregate
The interface requires implementinggetIterator()which returns an iterator object.Step 2: Connect to foreach usage
This allows the object to be used inforeachloops by providing the iterator externally.Final Answer:
To allow an object to be iterated withforeachby providing an external iterator. -> Option AQuick Check:
IteratorAggregate enables foreach iteration [OK]
- Thinking it sorts data automatically
- Confusing it with string conversion
- Assuming it enforces type checks
Which method must a class implement when it uses the IteratorAggregate interface?
Solution
Step 1: Recall interface requirements
TheIteratorAggregateinterface requires thegetIterator()method.Step 2: Confirm method name
This method must return an iterator object to enable iteration.Final Answer:
getIterator() -> Option CQuick Check:
IteratorAggregate requires getIterator() [OK]
- Using iterate() instead of getIterator()
- Confusing with toArray() method
- Assuming getItems() is required
What will be the output of this PHP code?
<?php
class MyCollection implements IteratorAggregate {
private array $items = [1, 2, 3];
public function getIterator(): Traversable {
return new ArrayIterator($this->items);
}
}
$collection = new MyCollection();
foreach ($collection as $item) {
echo $item . ' ';
}Solution
Step 1: Understand getIterator() return
The method returns anArrayIteratorover the array [1, 2, 3].Step 2: foreach loops over iterator
The foreach loop iterates over the items 1, 2, and 3, echoing each with a space.Final Answer:
1 2 3 -> Option BQuick Check:
foreach prints each item from ArrayIterator [OK]
- Expecting an error because getIterator returns ArrayIterator
- Thinking it prints object instead of values
- Missing the space after each number
Identify the error in this PHP class implementing IteratorAggregate:
<?php
class Numbers implements IteratorAggregate {
private array $nums = [10, 20, 30];
public function getIterator() {
return $this->nums;
}
}Solution
Step 1: Check getIterator() return type
It returns an array, butgetIterator()must return an object implementingTraversable.Step 2: Understand interface contract
Returning an array causes a type error because arrays do not implementTraversable.Final Answer:
getIterator() must return an object implementing Traversable, not an array. -> Option AQuick Check:
getIterator() returns Traversable object [OK]
- Returning array directly from getIterator()
- Thinking private properties cause error here
- Assuming getIterator() must be static
You want to create a class FilteredCollection that implements IteratorAggregate and only iterates over items greater than 5 from an internal array. Which implementation of getIterator() is correct?
<?php
class FilteredCollection implements IteratorAggregate {
private array $items;
public function __construct(array $items) {
$this->items = $items;
}
public function getIterator(): Traversable {
// Which code below is correct?
}
}Solution
Step 1: Filter items greater than 5
Usearray_filterwith a callback to keep only values > 5.Step 2: Return an ArrayIterator over filtered items
Wrap filtered array inArrayIteratorto satisfyTraversablereturn type.Final Answer:
return new ArrayIterator(array_filter($this->items, fn($v) => $v > 5)); -> Option DQuick Check:
Filter then wrap in ArrayIterator [OK]
- Returning unfiltered array directly
- Using array_map instead of array_filter
- Not wrapping result in an iterator object
Ready to prove it?
Pass the test and this pattern moves unknown
