【PHP8.x】Dom\TokenList::lengthプロパティの使い方
lengthプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
lengthプロパティは、Dom\TokenListオブジェクトに含まれるトークンの総数を整数値で保持するプロパティです。Dom\TokenListは、HTML要素のclass属性のように、スペースで区切られた文字列の集合を表現します。このプロパティを参照することで、リスト内に存在するトークンがいくつあるかを簡単に確認できます。例えば、ある要素に3つのクラス名が指定されていれば、その要素に対応するTokenListオブジェクトのlengthプロパティの値は3となります。このプロパティは読み取り専用であるため、値を直接変更してトークンの数を変えることはできません。トークンの数を変更するには、add()やremove()といったメソッドを使用してトークンを追加または削除する必要があり、その結果としてlengthの値が自動的に更新されます。このプロパティは、forループでリスト内のすべてのトークンを処理する際の繰り返し回数を決定したり、リストにトークンが存在するかどうかを判定したりする場合に役立ちます。
構文(syntax)
1<?php 2 3$document = new Dom\Document(); 4$document->loadHTML('<p class="alert info important"></p>'); 5$element = $document->getElementsByTagName('p')[0]; 6 7// Dom\TokenListオブジェクトのlengthプロパティにアクセスします 8$length = $element->classList->length; 9 10var_dump($length); 11 12?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
Dom\TokenList オブジェクトに含まれるトークンの数を整数で返します。
サンプルコード
PHP Dom\TokenList length でクラス数取得
1<?php 2 3declare(strict_types=1); 4 5/** 6 * HTML要素のクラス属性に含まれるクラス名の数を数えます。 7 * 8 * Dom\TokenList->length は、HTML要素のclass属性など、 9 * スペースで区切られたトークンのリストに含まれるトークンの数を返します。 10 * これは文字列全体の文字数ではなく、トークンの「個数」です。 11 */ 12function countClassTokens(): void 13{ 14 // サンプルとなるHTML文字列を定義します。 15 // このdiv要素は "item", "active", "featured" という3つのクラスを持っています。 16 $html = '<div id="myElement" class="item active featured">Hello World</div>'; 17 18 // DOMDocumentオブジェクトを作成し、HTMLを読み込みます。 19 // PHP 8以降では、Dom\Document クラスを使用します。 20 $dom = new Dom\Document(); 21 $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 22 23 // id属性を手がかりに、対象のHTML要素を取得します。 24 $element = $dom->getElementById('myElement'); 25 26 // 要素が存在する場合のみ処理を続行します。 27 if ($element) { 28 // 要素のclassListプロパティは Dom\TokenList オブジェクトを返します。 29 $tokenList = $element->classList; 30 31 // Dom\TokenList->length プロパティで、トークン(クラス名)の数を取得します。 32 $numberOfClasses = $tokenList->length; 33 34 // 結果を出力します。 35 echo "HTML: " . htmlspecialchars($html) . PHP_EOL; 36 echo "この要素に含まれるクラス名の数: " . $numberOfClasses . PHP_EOL; // 出力: 3 37 } else { 38 echo "指定されたIDの要素が見つかりませんでした。" . PHP_EOL; 39 } 40} 41 42// 関数を実行します。 43countClassTokens();
Dom\TokenListクラスのlengthプロパティは、HTML要素のclass属性のように、スペースで区切られたトークン(単語)の総数を取得するために使用します。これはプロパティのため引数はなく、戻り値としてトークンの個数を整数(int)で返します。
一般的にlengthは文字列の「文字数」を数える機能と混同されやすいですが、このlengthプロパティは文字数ではなく、トークンの「個数」を数える点が重要です。
サンプルコードでは、まず<div class="item active featured">というHTMLを解析しています。このdiv要素はitem、active、featuredという3つのクラス名を持っています。コード内で要素のclassListプロパティにアクセスすると、クラス名を管理するDom\TokenListオブジェクトが得られます。
そして、そのオブジェクトのlengthプロパティを参照することで、クラス名の個数を取得しています。class属性の値は"item active featured"という一つの文字列ですが、スペースで区切られた3つのトークンとして認識されるため、lengthプロパティは3という整数を返します。このように、Dom\TokenList->lengthは、特定のHTML要素がいくつのクラスを持っているかを簡単に確認したい場合に役立ちます。
Dom\TokenList->lengthは、文字列全体の文字数を数えるのではなく、スペースで区切られたトークン(単語)の「個数」を返すプロパティです。一般的な文字列の長さを取得するstrlen()関数とは役割が全く異なるため注意してください。このlengthプロパティはDom\TokenListオブジェクトに対してのみ使用できます。サンプルコードのようにgetElementByIdでHTML要素を取得する際は、要素が見つからない場合にnullが返るため、必ずif文などで存在を確認してからプロパティにアクセスすることが安全な利用につながります。また、Dom\DocumentクラスはPHP 8.0以降で利用可能です。
PHP Dom\TokenListのlengthでクラス数を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * Dom\TokenListのlengthプロパティの使用例を示します。 7 * 8 * HTML要素のclass属性値(トークンリスト)に含まれるトークン(クラス名)の数を取得します。 9 * これは、配列の要素数を数えることに似ています。 10 */ 11function demonstrateTokenListLength(): void 12{ 13 // サンプルとなるHTML文字列を定義します。 14 // <p> タグには、スペースで区切られた3つのクラス名が含まれています。 15 $html = '<!DOCTYPE html> 16 <html> 17 <body> 18 <p class="item selected active">この段落には3つのクラスがあります。</p> 19 </body> 20 </html>'; 21 22 // DOMDocumentオブジェクトを作成し、HTMLを読み込みます。 23 $dom = new DOMDocument(); 24 // エラーを抑制し、内部で処理します。 25 @$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 26 27 // 最初の <p> 要素を取得します。 28 /** @var \DOMElement $pElement */ 29 $pElement = $dom->getElementsByTagName('p')->item(0); 30 31 // <p> 要素の classList プロパティ(Dom\TokenList オブジェクト)を取得します。 32 $tokenList = $pElement->classList; 33 34 // length プロパティを使用して、トークンリストに含まれるクラス名の数を取得します。 35 // この例では "item", "selected", "active" の3つなので、結果は 3 となります。 36 $count = $tokenList->length; 37 38 echo "p要素のクラスの数: " . $count . PHP_EOL; 39 40 // 参考: TokenListはイテレート(繰り返し処理)も可能です。 41 echo "含まれるクラス一覧:" . PHP_EOL; 42 foreach ($tokenList as $className) { 43 echo "- " . $className . PHP_EOL; 44 } 45} 46 47demonstrateTokenListLength(); 48 49?>
PHPのDom\TokenListクラスが持つlengthプロパティは、HTML要素のclass属性に含まれるクラス名の総数を取得するために使用します。これは、配列の要素数を数えることとよく似た機能です。
このプロパティは値を取得するだけなので、引数は必要ありません。値として、クラス名の数を整数(int)で返します。
サンプルコードでは、<p class="item selected active">というHTML要素を対象にしています。まず、この<p>要素オブジェクトからclassListプロパティを取得し、Dom\TokenListオブジェクトを得ます。このオブジェクトは、"item"、"selected"、"active"という3つのクラス名を内部で管理しています。
次に、$tokenList->lengthのようにlengthプロパティにアクセスすると、これらのクラス名の総数である3が整数値として取得できます。このプロパティを使うことで、DOM操作において特定の要素が持つクラスの数を簡単に知ることができます。
Dom\TokenListのlengthプロパティは、HTML要素のclass属性に含まれるクラス名の数を取得するためのものです。これはPHPの一般的な配列とは異なり、DOM操作専用のオブジェクトで使われる点に注意が必要です。そのため、配列の要素数を数えるcount()関数とは区別して考えましょう。コードを安全に利用するため、lengthプロパティにアクセスする前には、対象となるDOM要素が正しく取得できているか(nullでないか)を確認することが重要です。該当要素が存在しない場合にエラーが発生するのを防げます。また、このlengthプロパティは読み取り専用であり、直接数値を代入してクラスの数を変更することはできません。