PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのIteratorAggregateインターフェース徹底解説!外部イテレータの作成方法

はじめに

IteratorAggregateインターフェースは、抽象インターフェースであるTraversableを継承しています。このインターフェースをクラスに実装することで、そのクラスに対して外部イテレータ(External Iterator)を作成できるようになります。IteratorAggregateには、getIterator()という抽象メソッドが1つだけ定義されています。

構文

IteratorAggregate extends Traversable {
    /* メソッド */
    abstract public getIterator ( void ) : Traversable
}

メソッド

IteratorAggregateインターフェースには、以下のメソッドが定義されています。

IteratorAggregate::getIterator — 外部イテレータを取得する

このメソッドは引数を受け取らず、IteratorまたはTraversableを実装したオブジェクトのインスタンスを返します。

Iteratorインターフェースとの違い

Iteratorインターフェースを実装する場合は、クラス自身が現在位置などの反復状態を内部的に管理する必要があります。一方、IteratorAggregateでは外部イテレータを返すだけでよいため、反復処理のロジックをArrayIteratorなどの別クラスに委譲できます。その結果、コードの責務が明確に分離され、再利用性も向上します。

IteratorAggregateの使用例

次のPHPスクリプトでは、IteratorAggregateインターフェースを実装したクラスが、配列をプロパティとして持っています。getIterator()メソッドは、この配列からArrayIteratorオブジェクトを生成して返します。これにより、foreachループを使ってオブジェクト内の配列を簡単に走査できるようになります。

コード例

<?php
class myIterator implements IteratorAggregate {
    public $arr;
    public function __construct() {
        $this->arr = array(10,20,30,40);
    }
    public function getIterator() {
        return new ArrayIterator($this->arr);
    }
}
$obj = new myIterator();
foreach($obj as $key => $value) {
    echo $key ." =>" . $value . "\n";
}
?>

実行結果

配列プロパティを走査すると、以下のような結果が出力されます。

0=>10
1=>20
2=>30
3=>40
  1. PHPのポリモーフィズムとは?インターフェースを使った実装例で解説

    ポリモーフィズムとは何か ポリモーフィズム(Polymorphism)は、ギリシャ語の「Poly(多数の)」と「morphism(形)」に由来する言葉で、直訳すると「多くの形」という意味になります。 オブジェクト指向プログラミングにおけるポリモーフィズムとは、異なるクラスに属していても、似たような処理を行うメソッドには同じ名前を付けるべきだという設計原則のことです。これはOOP(オブジェクト指向プログラミング)の基本的なパターンの一つであり、機能の異なる複数のクラスが共通のインターフェースを実行・共有することを可能にします。 この原則の大きな利点は、コードがどのクラスに属しているかを呼び出し側

  2. PHPのinterface_exists()関数とは?使い方とサンプルコードを解説

    interface_exists()関数は、指定したインターフェースがすでに定義されているかどうかを確認するためのPHP組み込み関数です。name_of_interfaceで指定されたインターフェースが定義済みであればTRUEを返し、未定義であればFALSEを返します。 基本構文 interface_exists(name_of_interface, autoload) パラメータ name_of_interface − 存在を確認したいインターフェース名(文字列で指定)。 autoload − __autoload(またはSPLオートローダー)を呼び出すかどうか。デフォルトはtrueです。