What are the key differences between iterating over a specific data type in PHP and implementing a data type as an Iterator?

When iterating over a specific data type in PHP, you typically use foreach loops to access each element in the data structure. However, if you want to implement a custom data type as an Iterator, you need to create a class that implements the Iterator interface. This allows you to define custom behavior for iterating over the elements of your data type.

// Example of iterating over a specific data type
$numbers = [1, 2, 3, 4, 5];

foreach ($numbers as $number) {
    echo $number . "\n";
}

// Example of implementing a custom data type as an Iterator
class CustomIterator implements Iterator {
    private $data = [1, 2, 3, 4, 5];
    private $position = 0;

    public function current() {
        return $this->data[$this->position];
    }

    public function key() {
        return $this->position;
    }

    public function next() {
        $this->position++;
    }

    public function rewind() {
        $this->position = 0;
    }

    public function valid() {
        return isset($this->data[$this->position]);
    }
}

$customIterator = new CustomIterator();

foreach ($customIterator as $number) {
    echo $number . "\n";
}