【PHP8.x】Dom\TokenList::getIterator()メソッドの使い方
getIteratorメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getIteratorメソッドは、Dom\TokenListオブジェクトが保持するトークンの集合を、順番に処理するためのイテレータを取得するメソッドです。Dom\TokenListは、HTML要素のclass属性値のように、スペースで区切られた複数の文字列(トークン)のリストを表現するオブジェクトです。このメソッドはIteratorAggregateインターフェースの実装として提供されており、Dom\TokenListオブジェクトをforeach構文などで直接反復処理できるようにする重要な役割を担っています。開発者がこのメソッドを明示的に呼び出すことは通常ありません。代わりに、foreachループでDom\TokenListオブジェクトを指定すると、PHPが内部的にこのgetIteratorメソッドを自動で呼び出し、返されたイテレータを利用してリスト内の各トークンを一つずつ取り出します。この仕組みにより、トークンリストの内容を簡単かつ直感的にループ処理することが可能になります。返り値は、リストの各要素を指し示すことができるTraversableなイテレータオブジェクトとなります。
構文(syntax)
1<?php 2 3$html = '<!DOCTYPE html><html><body><div id="target" class="class-a class-b class-c"></div></body></html>'; 4$doc = new DOMDocument(); 5$doc->loadHTML($html); 6$element = $doc->getElementById('target'); 7 8// $element->classList は Dom\TokenList オブジェクトです 9$tokenList = $element->classList; 10 11// foreach ループで反復処理すると、内部的に getIterator() が呼び出されます 12foreach ($tokenList as $token) { 13 echo $token . PHP_EOL; 14} 15 16?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
Traversable
Dom\TokenList::getIterator は、トークンリストを順にたどるためのイテレータを返します。このイテレータを使用することで、リスト内の各トークンに順番にアクセスできます。
サンプルコード
S3バケットオブジェクト一覧取得機能
1<?php 2 3/** 4 * このスクリプトを実行する前に、ターミナルで以下のコマンドを実行して 5 * AWS SDK for PHP をインストールする必要があります。 6 * $ composer require aws/aws-sdk-php 7 */ 8require 'vendor/autoload.php'; 9 10use Aws\S3\S3Client; 11use Aws\Exception\AwsException; 12 13/** 14 * AWS S3バケット内のオブジェクト一覧を取得して表示します。 15 * 16 * getIteratorは、大量のオブジェクトが存在する場合でも、内部的にAPIを複数回呼び出し、 17 * メモリを効率的に使用しながら結果を一つずつ処理するための機能です。 18 */ 19class S3ObjectLister 20{ 21 /** 22 * @var S3Client S3クライアントのインスタンス 23 */ 24 private S3Client $s3Client; 25 26 /** 27 * コンストラクタ 28 * 29 * @param array $config S3クライアントを初期化するための設定配列 30 * (例: ['region' => 'ap-northeast-1', 'version' => 'latest']) 31 */ 32 public function __construct(array $config) 33 { 34 // S3クライアントを生成します。 35 // 認証情報は環境変数やIAMロールから自動的に読み込まれるのが一般的です。 36 $this->s3Client = new S3Client($config); 37 } 38 39 /** 40 * 指定されたS3バケット内のオブジェクトキーを一覧表示します。 41 * 42 * @param string $bucketName オブジェクトキーを一覧表示するバケット名 43 */ 44 public function displayObjectKeys(string $bucketName): void 45 { 46 echo "Listing objects in bucket '{$bucketName}'..." . PHP_EOL; 47 48 try { 49 // 'ListObjectsV2' コマンドのイテレータを取得します。 50 // これにより、バケット内の全オブジェクトを foreach でループ処理できます。 51 $iterator = $this->s3Client->getIterator('ListObjectsV2', [ 52 'Bucket' => $bucketName, 53 ]); 54 55 $count = 0; 56 // イテレータを使って各オブジェクトを順に処理します。 57 foreach ($iterator as $object) { 58 // オブジェクトのキー(ファイルパス)を出力します。 59 echo $object['Key'] . PHP_EOL; 60 $count++; 61 } 62 63 echo "------------------------------------" . PHP_EOL; 64 echo "Found {$count} object(s)." . PHP_EOL; 65 66 } catch (AwsException $e) { 67 // エラーが発生した場合、メッセージを出力します。 68 error_log("S3 Error: " . $e->getAwsErrorMessage()); 69 echo "Error: Failed to list objects. Check logs for details." . PHP_EOL; 70 } 71 } 72} 73 74// --- 実行コード --- 75 76// AWSクライアントの設定 77// TODO: あなたの環境に合わせてリージョンを変更してください。 78$config = [ 79 'region' => 'ap-northeast-1', // 例: 東京リージョン 80 'version' => 'latest', 81]; 82 83// オブジェクトを一覧表示したいS3バケット名 84// TODO: あなたのS3バケット名に変更してください。 85$targetBucket = 'your-s3-bucket-name'; 86 87// AWSの認証情報が設定されていない場合のエラーチェック 88if (empty(getenv('AWS_ACCESS_KEY_ID')) && empty(getenv('AWS_SECRET_ACCESS_KEY'))) { 89 echo "Warning: AWS credentials not found in environment variables." . PHP_EOL; 90 echo "Please configure AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY." . PHP_EOL; 91 // IAMロールなど他の認証方法を使っている場合は、この警告は無視して構いません。 92} 93 94 95// バケット名が設定されているか確認 96if ($targetBucket === 'your-s3-bucket-name') { 97 echo "Error: Please set your S3 bucket name in the '\$targetBucket' variable." . PHP_EOL; 98} else { 99 // クラスをインスタンス化 100 $lister = new S3ObjectLister($config); 101 // メソッドを実行 102 $lister->displayObjectKeys($targetBucket); 103}
このPHPスクリプトは、指定したAWS S3バケット内に保存されているオブジェクト(ファイル)の一覧を取得し、そのキー(ファイルパス)を表示するサンプルコードです。中心的な役割を担っているのが、AWS SDKに含まれるS3ClientクラスのgetIteratorメソッドです。
getIteratorメソッドは、第一引数に実行したいS3の操作名(この例ではオブジェクト一覧を取得する 'ListObjectsV2')、第二引数にその操作に必要なパラメータ(バケット名など)を配列で指定します。このメソッドの最大の特徴は、S3バケット内に数千、数万といった大量のオブジェクトが存在する場合でも、それらを一度にメモリへ読み込むのではなく、少しずつ取得しながら処理できる点です。内部ではAPIからの応答を分割して受け取る処理(ページネーション)が自動的に行われるため、メモリを効率的に使用できます。
このメソッドは戻り値として、foreach構文で繰り返し処理が可能な「イテレータ」を返します。サンプルコードでは、このイテレータをforeachでループさせることで、バケット内のオブジェクト情報を一件ずつ取り出し、各オブジェクトのキーである$object['Key']を画面に出力しています。
このサンプルコードを実行するには、コメントにある通り、事前にComposerでAWS SDKをインストールする必要があります。コード中のリージョン(region)とバケット名($targetBucket)は、ご自身の環境に合わせて必ず変更してください。AWSの認証情報は、セキュリティリスクを避けるため、コードに直接書き込まず、環境変数やIAMロールで設定するのが一般的です。getIteratorメソッドは、S3バケット内に大量のオブジェクトがあっても、全件を一度に読み込まずに少しずつ処理するため、メモリを効率的に使用できます。バケットが存在しない場合やアクセス権限がない場合はエラーとなるため、try-catchによる例外処理は不可欠です。