【PHP8.x】getIteratorメソッドの使い方

getIteratorメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getIteratorメソッドは、PHP 8で導入されたWeakMapクラスのインスタンスが保持する要素を繰り返し処理(イテレーション)するためのIteratorオブジェクトを返すメソッドです。WeakMapは、キーとしてオブジェクトのみを受け入れ、そのキーオブジェクトへの参照が他に存在しなくなった際に、自動的にそのエントリ(キーと値のペア)を削除するという特殊な性質を持つマップです。

このgetIteratorメソッドを呼び出すと、WeakMapの現在の状態を表すイテレータが生成されます。このイテレータを使用することで、開発者はWeakMapに格納されているキーと値のペアを順次取り出して処理することが可能になります。例えば、foreachループでWeakMapのインスタンスを直接使用すると、内部的にはこのgetIteratorメソッドが呼び出され、イテレータを通じて各要素にアクセスできるようになります。

ただし、WeakMapの特性上、イテレーション中にキーとなっているオブジェクトがガベージコレクションによって参照を失い、マップから自動的に削除される可能性があります。そのため、イテレーション中に要素の数が変動したり、期待していた要素が見つからなくなる場合がある点には注意が必要です。このメソッドは、WeakMapの内容を監視したり、特定時点でのデータに基づいて処理を行いたい場合に役立ちます。WeakMapの動的な性質を理解した上で活用することが重要です。

構文(syntax)

1<?php
2$weakMap = new WeakMap();
3$keyObject1 = new stdClass();
4$keyObject2 = new stdClass();
5
6$weakMap[$keyObject1] = 'value1';
7$weakMap[$keyObject2] = 'value2';
8
9$iterator = $weakMap->getIterator();
10
11foreach ($iterator as $key => $value) {
12    // $key は WeakMap に格納されたオブジェクト
13    // $value はそのオブジェクトに対応する値
14}

引数(parameters)

引数なし

引数はありません

戻り値(return)

Iterator

WeakMap::getIterator は、WeakMap オブジェクトのキーと値のペアを順番に取得するためのイテレータを返します。

サンプルコード

PHP WeakMap getIterator でループ処理

1<?php
2
3/**
4 * WeakMap::getIterator() のサンプルコード
5 */
6
7// WeakMap を利用するには PHP 7.4 以降が必要です。
8if (PHP_VERSION_ID < 70400) {
9    exit("PHP 7.4 以降が必要です。\n");
10}
11
12use WeakMap;
13
14class MyClass {
15    public string $name;
16
17    public function __construct(string $name) {
18        $this->name = $name;
19    }
20}
21
22$wm = new WeakMap();
23
24$obj1 = new MyClass("Object 1");
25$obj2 = new MyClass("Object 2");
26
27$wm[$obj1] = "Data for Object 1";
28$wm[$obj2] = "Data for Object 2";
29
30// getIterator() でイテレータを取得
31$iterator = $wm->getIterator();
32
33// イテレータを使って WeakMap の内容をループ処理
34foreach ($iterator as $key => $value) {
35    // $key は WeakMap のキー (オブジェクト)
36    // $value は WeakMap の値
37    echo "Key: " . $key->name . ", Value: " . $value . "\n";
38}
39
40// オブジェクトの参照を削除すると、WeakMap からも削除される
41unset($obj1);
42
43echo "After unsetting \$obj1:\n";
44
45$iterator = $wm->getIterator();
46foreach ($iterator as $key => $value) {
47    echo "Key: " . $key->name . ", Value: " . $value . "\n";
48}

WeakMap::getIterator() は、PHP 8 で利用可能な WeakMap クラスのメソッドで、WeakMap オブジェクトの内容を反復処理するためのイテレータを取得します。引数はなく、戻り値として Iterator インターフェースを実装したオブジェクトを返します。

サンプルコードでは、まず WeakMap オブジェクトを作成し、キーとして MyClass のインスタンス、値として文字列を格納しています。getIterator() を呼び出すことで、この WeakMap の内容を走査できるイテレータを取得できます。

取得したイテレータは foreach ループで使用し、WeakMap に格納されたキーと値を順番に処理します。キーは MyClass のインスタンスであり、値は対応する文字列です。ループ内では、キーオブジェクトの name プロパティと値を表示しています。

WeakMap の重要な特性として、キーとして使用されているオブジェクトへの参照がなくなると、WeakMap から自動的に削除される点が挙げられます。サンプルコードでは、$obj1 への参照を unset() で削除した後、再度イテレータを取得してループ処理を行うことで、$obj1 に関連付けられたデータが WeakMap から削除されていることを確認できます。この挙動により、メモリリークを防ぎ、効率的なメモリ管理を実現できます。

このサンプルコードは、WeakMapのgetIterator()メソッドの使い方を示しています。getIterator()は、WeakMapの内容をループ処理するためのイテレータを返します。

注意点として、WeakMapはPHP 7.4以降でのみ利用可能です。コード冒頭でバージョンチェックを行っているのはそのためです。また、イテレータで取得できるキーはWeakMapに格納されたオブジェクトそのものであり、値は対応するデータです。

重要なのは、WeakMapはキーとして使用したオブジェクトへの参照がなくなると、自動的にそのエントリを削除する点です。サンプルコードではunset($obj1)$obj1への参照を削除後、再度イテレータでループ処理を行い、$obj1に対応するエントリが削除されていることを確認しています。WeakMapの特性を理解して利用することが重要です。