PHPのIteratorインターフェースとは?基本構文と実装方法を解説
はじめに
Iteratorインターフェースは、抽象インターフェースであるTraversableを継承しています。PHPにはSPLイテレータと呼ばれる数多くの組み込みイテレータが用意されており、ArrayIteratorやDirectoryIteratorなど、日常的なさまざまな処理に活用できます。ユーザー定義クラスでIteratorインターフェースを実装する場合は、インターフェースで定義されている抽象メソッドをすべて実装しなければなりません。
構文
Iterator extends Traversable {
/* メソッド */
abstract public current ( void ) : mixed
abstract public key ( void ) : scalar
abstract public next ( void ) : void
abstract public rewind ( void ) : void
abstract public valid ( void ) : bool
}メソッド一覧
Iterator::current ― 現在の要素を返します。
Iterator::key ― 現在の要素のキーを返します。
Iterator::next ― 次の要素へ移動します。
Iterator::rewind ― イテレータを最初の要素に巻き戻します。
Iterator::valid ― 現在位置が有効かどうかを判定します。
なお、Traversableを継承するIteratorAggregateやIteratorインターフェースを実装する際は、implements句の中でクラス名よりも前にこれらを記述する必要があります。
Iterator実装のサンプル
次のPHPスクリプトでは、Iteratorインターフェースを実装したクラスが、プライベート変数として配列を保持しています。Iteratorの抽象メソッドを実装することで、foreachループによる走査に加えて、next()メソッドを使った走査も可能になります。
コード例
<?php
class myIterator implements Iterator {
private $index = 0;
private $arr = array(10,20,30,40);
public function __construct() {
$this->index = 0;
}
public function rewind() {
$this->index = 0;
}
public function current() {
return $this->arr[$this->index];
}
public function key() {
return $this->index;
}
public function next() {
++$this->index;
}
public function valid() {
return isset($this->arr[$this->index]);
}
}
?>foreachループを使えば、myIteratorオブジェクトの配列プロパティを反復処理できます。
$it = new myIterator();
foreach($it as $key => $value) {
echo "$key=>". $value ."\n";
}また、whileループの中でnext()メソッドを呼び出して反復処理を行うこともできます。この場合、ループを開始する前に必ずrewind()でイテレータを先頭に巻き戻しておきましょう。
コード例
$it->rewind();
do {
echo $it->key() . "=>" .$it->current() . "\n";
$it->next();
}
while ($it->valid());実行結果
どちらの方法でも、配列プロパティの走査結果は以下のようになります。
0=>10 1=>20 2=>30 3=>40
-
PHPのポリモーフィズムとは?インターフェースを使った実装例で解説
ポリモーフィズムとは何か ポリモーフィズム(Polymorphism)は、ギリシャ語の「Poly(多数の)」と「morphism(形)」に由来する言葉で、直訳すると「多くの形」という意味になります。 オブジェクト指向プログラミングにおけるポリモーフィズムとは、異なるクラスに属していても、似たような処理を行うメソッドには同じ名前を付けるべきだという設計原則のことです。これはOOP(オブジェクト指向プログラミング)の基本的なパターンの一つであり、機能の異なる複数のクラスが共通のインターフェースを実行・共有することを可能にします。 この原則の大きな利点は、コードがどのクラスに属しているかを呼び出し側
-
PHPのinterface_exists()関数とは?使い方とサンプルコードを解説
interface_exists()関数は、指定したインターフェースがすでに定義されているかどうかを確認するためのPHP組み込み関数です。name_of_interfaceで指定されたインターフェースが定義済みであればTRUEを返し、未定義であればFALSEを返します。 基本構文 interface_exists(name_of_interface, autoload) パラメータ name_of_interface − 存在を確認したいインターフェース名(文字列で指定)。 autoload − __autoload(またはSPLオートローダー)を呼び出すかどうか。デフォルトはtrueです。