Bird
Raised Fist0
PHPprogramming~10 mins

IteratorAggregate interface in PHP - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - IteratorAggregate interface
Create class implementing IteratorAggregate
↓
Define getIterator() method
↓
Inside getIterator(), return an Iterator object
↓
Use foreach on class instance
↓
foreach calls getIterator()
↓
Iterate over returned Iterator
↓
Access each element in loop
↓
End
This flow shows how a class implements IteratorAggregate by defining getIterator() which returns an iterator used by foreach to loop over elements.
Execution Sample
PHP
<?php
class MyCollection implements IteratorAggregate {
  private array $items = ["apple", "banana", "cherry"];
  public function getIterator(): Traversable {
    return new ArrayIterator($this->items);
  }
}
foreach (new MyCollection() as $item) {
  echo $item . "\n";
}
This code defines a class that returns an iterator over an array, then loops over it printing each item.
Execution Table
StepActionCode LineResult/Output
1Create MyCollection instance$collection = new MyCollection();Object created with items ["apple", "banana", "cherry"]
2foreach starts looping over $collectionforeach (new MyCollection() as $item)Calls getIterator() method
3Call getIterator()public function getIterator()Returns ArrayIterator over items
4First iterationecho $item . "\n";Outputs: apple
5Second iterationecho $item . "\n";Outputs: banana
6Third iterationecho $item . "\n";Outputs: cherry
7No more itemsforeach endsLoop ends, iteration stops
💡 Iteration stops when ArrayIterator has no more elements.
Variable Tracker
VariableStartAfter Step 4After Step 5After Step 6Final
$items["apple", "banana", "cherry"]["apple", "banana", "cherry"]["apple", "banana", "cherry"]["apple", "banana", "cherry"]["apple", "banana", "cherry"]
$itemundefinedapplebananacherryundefined (loop ended)
Key Moments - 3 Insights
Why does foreach call getIterator() on the object?
Because the class implements IteratorAggregate, foreach looks for getIterator() to get an iterator to loop over, as shown in execution_table step 2 and 3.
What type of object must getIterator() return?
It must return an object implementing Traversable, like ArrayIterator, so foreach can iterate over it (see step 3).
Why does $item change each iteration?
$item gets assigned the current element from the iterator each loop cycle, shown in steps 4, 5, and 6.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the output at step 5?
Aapple
Bbanana
Ccherry
DNo output
💡 Hint
Check the 'Result/Output' column for step 5 in execution_table.
At which step does foreach call getIterator()?
AStep 2
BStep 1
CStep 3
DStep 4
💡 Hint
Look at the 'Action' column describing foreach starting and calling getIterator().
If getIterator() returned a non-iterator object, what would happen?
ALoop would run zero times silently
Bforeach would loop normally
CPHP would throw an error
DOutput would be empty strings
💡 Hint
Recall that getIterator() must return Traversable; otherwise, foreach cannot iterate (see key_moments).
Concept Snapshot
IteratorAggregate interface:
- Implement IteratorAggregate in your class
- Define getIterator() method
- getIterator() returns an iterator (implements Traversable)
- foreach uses getIterator() to loop
- Enables custom iteration over objects
Full Transcript
This example shows how a PHP class uses the IteratorAggregate interface to allow foreach loops over its data. The class defines getIterator() which returns an ArrayIterator over an internal array. When foreach runs, it calls getIterator() to get the iterator, then loops over each element, assigning it to the loop variable and printing it. The execution table traces each step: creating the object, calling getIterator(), and each iteration output. Variables like $item change each loop. Key points include that foreach calls getIterator() automatically on objects implementing IteratorAggregate, and getIterator() must return an iterator object. If it doesn't, PHP throws an error. This pattern helps make objects iterable in a simple, flexible way.

Practice

(1/5)
1.

What is the main purpose of the IteratorAggregate interface in PHP?

easy
A. To allow an object to be iterated with foreach by providing an external iterator.
B. To automatically sort arrays inside an object.
C. To enforce type checking on array elements.
D. To convert an object into a string representation.

Solution

  1. Step 1: Understand the role of IteratorAggregate

    The interface requires implementing getIterator() which returns an iterator object.
  2. Step 2: Connect to foreach usage

    This allows the object to be used in foreach loops by providing the iterator externally.
  3. Final Answer:

    To allow an object to be iterated with foreach by providing an external iterator. -> Option A
  4. Quick Check:

    IteratorAggregate enables foreach iteration [OK]
Hint: Remember: IteratorAggregate provides an iterator for foreach [OK]
Common Mistakes:
  • Thinking it sorts data automatically
  • Confusing it with string conversion
  • Assuming it enforces type checks
2.

Which method must a class implement when it uses the IteratorAggregate interface?

easy
A. getItems()
B. iterate()
C. getIterator()
D. toArray()

Solution

  1. Step 1: Recall interface requirements

    The IteratorAggregate interface requires the getIterator() method.
  2. Step 2: Confirm method name

    This method must return an iterator object to enable iteration.
  3. Final Answer:

    getIterator() -> Option C
  4. Quick Check:

    IteratorAggregate requires getIterator() [OK]
Hint: Interface method is always getIterator() [OK]
Common Mistakes:
  • Using iterate() instead of getIterator()
  • Confusing with toArray() method
  • Assuming getItems() is required
3.

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 . ' ';
}
medium
A. ArrayIterator Object
B. 1 2 3
C. Error: getIterator must return array
D. No output

Solution

  1. Step 1: Understand getIterator() return

    The method returns an ArrayIterator over the array [1, 2, 3].
  2. Step 2: foreach loops over iterator

    The foreach loop iterates over the items 1, 2, and 3, echoing each with a space.
  3. Final Answer:

    1 2 3 -> Option B
  4. Quick Check:

    foreach prints each item from ArrayIterator [OK]
Hint: getIterator returns ArrayIterator to enable foreach [OK]
Common Mistakes:
  • Expecting an error because getIterator returns ArrayIterator
  • Thinking it prints object instead of values
  • Missing the space after each number
4.

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;
    }
}
medium
A. getIterator() must return an object implementing Traversable, not an array.
B. Property $nums should be public, not private.
C. Class must implement Iterator, not IteratorAggregate.
D. getIterator() method must be static.

Solution

  1. Step 1: Check getIterator() return type

    It returns an array, but getIterator() must return an object implementing Traversable.
  2. Step 2: Understand interface contract

    Returning an array causes a type error because arrays do not implement Traversable.
  3. Final Answer:

    getIterator() must return an object implementing Traversable, not an array. -> Option A
  4. Quick Check:

    getIterator() returns Traversable object [OK]
Hint: getIterator must return Traversable object, not array [OK]
Common Mistakes:
  • Returning array directly from getIterator()
  • Thinking private properties cause error here
  • Assuming getIterator() must be static
5.

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?
    }
}
hard
A. return new ArrayIterator($this->items);
B. return new ArrayIterator(array_map(fn($v) => $v > 5, $this->items));
C. return $this->items;
D. return new ArrayIterator(array_filter($this->items, fn($v) => $v > 5));

Solution

  1. Step 1: Filter items greater than 5

    Use array_filter with a callback to keep only values > 5.
  2. Step 2: Return an ArrayIterator over filtered items

    Wrap filtered array in ArrayIterator to satisfy Traversable return type.
  3. Final Answer:

    return new ArrayIterator(array_filter($this->items, fn($v) => $v > 5)); -> Option D
  4. Quick Check:

    Filter then wrap in ArrayIterator [OK]
Hint: Filter array first, then return ArrayIterator [OK]
Common Mistakes:
  • Returning unfiltered array directly
  • Using array_map instead of array_filter
  • Not wrapping result in an iterator object
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard