Array objects
abstract class Collection implements \ArrayAccess, \Iterator { private $position; private $array = []; public function __construct() { $this->position = 0; } public function current() { return $this->array[$this->position]; } public function offsetGet($offset) { return isset($this->array[$offset]) ? $this->array[$offset] : null; } public function offsetSet($offset, $value) { if (is_null($offset)) { $this->array[] = $value; } else { $this->array[$offset] = $value; } } public function offsetExists($offset) { return isset($this->array[$offset]); } public function offsetUnset($offset) { unset($this->array[$offset]); } public function next() { ++$this->position; } public function key() { return $this->position; } public function valid() { return isset($this->array[$this->position]); } public function rewind() { $this->position = 0; } }
A concrete implementation of the Collection
class.
class TypeCollection extends Collection { public function offsetSet($offset, $value) { if (!$value instanceof Type) { throw new \InvalidArgumentException("Value must be of type `Type`."); } parent::offsetSet($offset, $value); } public function offsetGet($offset): ?Type { return parent::offsetGet($offset); } public function current(): Type { return parent::current(); } }
Using the TypeCollection
can be done like this.
$collection = new TypeCollection(); $collection[] = new Type(); foreach ($collection as $item) { var_dump($item); }
👍