PHP でデザインパターン (Iterator)
PHP デザインパターン
Published: 2018-10-15

Iterator パターンとは

  • リストの内部構造を隠したまま、それぞれの要素にアクセスさせるためのパターン

  • オブジェクトに対する反復操作をおこなうための統一APIを提供するパターン

Iterator パターンのメリット

  • 利用者に、「どの様な構造を持つリストなのか」を意識させないようにできます。

実装例

<?php

class Employee
{
    private $name;
    private $age;
    private $job;

    public function __construct($name, $age, $job)
    {
        $this->name = $name;
        $this->age = $age;
        $this->job = $job;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getAge()
    {
        return $this->age;
    }

    public function getJob()
    {
        return $this->job;
    }
}

class Employees implements IteratorAggregate
{
    private $employees;
    public function __construct()
    {
        $this->employees = new ArrayObject();
    }

    public function add(Employee $employee)
    {
        $this->employees[] = $employee;
    }

    public function getIterator()
    {
        return $this->employees->getIterator();
    }
}

$employees = new Employees();
$employees->add(new Employee('SMITH', 32, 'CLERK'));
$employees->add(new Employee('ALLEN', 26, 'SALESMAN'));
$employees->add(new Employee('MARTIN', 50, 'SALESMAN'));
$employees->add(new Employee('CLARK', 45, 'MANAGER'));
$employees->add(new Employee('KING', 58, 'PRESIDENT'));

$iterator = $employees->getIterator();

while  ($iterator->valid()) {
    $employee = $iterator->current();

    printf(
        "%s (%d, %s)\n",
        $employee->getName(),
        $employee->getAge(),
        $employee->getJob()
    );

    $iterator->next();
}

参考