【PHP8.x】token_get_all()関数の使い方
token_get_all関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
token_get_all関数は、PHPのソースコードを解析し、それを構成する最小単位である「トークン」の配列として取得する関数です。この関数は、与えられたPHPのコード文字列を読み込み、PHPの文法規則に従って、キーワード、変数名、文字列、演算子、コメントといった意味のある要素に分解します。
この機能は、ソースコードの構造をプログラム的に分析したい場合に非常に有用です。例えば、コードの自動整形ツールや静的解析ツールを作成する際、特定のコードパターンを検出したり、コメントの内容を抽出したり、あるいは独自のコード変換処理を行う際の基盤となります。
token_get_all関数は、解析対象のPHPソースコード全体を文字列として引数に取ります。実行されると、そのソースコードが意味のある最小単位に分割されたトークンの配列を返します。この配列の各要素は、さらに配列または単一の文字列のいずれかです。配列として返されるトークンは、その種類を示す数値ID(例:T_VARIABLEなど)、実際のトークン文字列(例:$myVar)、そしてそのトークンが出現する行番号の3つの情報を含みます。一方、文字列として返されるトークンは、セミコロン;や括弧()など、単一の文字で表現される記号です。
このように、コードを詳細な要素に分解することで、PHPインタープリタが行う構文解析の初期段階を模倣し、開発支援ツールや高度なコード処理ロジックの実装を可能にします。通常のアプリケーション開発で直接使う機会は少ないかもしれませんが、PHPの内部構造を理解し、より高度な開発を行う上で役立つ重要な関数です。
構文(syntax)
1<?php 2$phpCodeString = '<?php echo "Hello World"; ?>'; 3$tokensArray = token_get_all($phpCodeString);
引数(parameters)
string $code, int $flags = 0
- string $code: 解析対象のPHPコードを指定する文字列
- int $flags = 0: トークン取得時の挙動を制御するフラグを指定する整数
戻り値(return)
array
PHPのtoken_get_all関数は、PHPソースコードをトークン(言語の最小単位)の配列として返します。各トークンは、その型、値、行番号などの情報を持つ配列として表現されます。
サンプルコード
PHPコードをトークンに分解する
1<?php 2 3/** 4 * PHPコードをトークンに分解し、その構造を分析するサンプル関数 5 * 6 * token_get_all() は、指定されたPHPコード文字列を解析し、 7 * PHPの文法に基づいたトークンの配列を返します。 8 * これはコードフォーマッターや静的解析ツールなどの開発に利用されます。 9 * 10 * @param string $phpCode 解析したいPHPコード 11 * @return void 12 */ 13function analyzePhpCode(string $phpCode): void 14{ 15 // token_get_all() を使ってコードをトークンに分割します。 16 // トークンとは、PHPがコードを解釈する際の最小単位(キーワード、変数名、記号など)です。 17 $tokens = token_get_all($phpCode); 18 19 echo "--- PHPコードの解析結果 ---\n"; 20 21 // 分割された各トークンの情報を順番に表示します。 22 foreach ($tokens as $token) { 23 // トークンが配列の場合、詳細な情報を持っています。 24 // [トークンID, トークンの文字列, 行番号] 25 if (is_array($token)) { 26 // token_name() でトークンIDを人間が読める名前に変換します (PHP 8.0以降で利用可能)。 27 $tokenName = token_name($token[0]); 28 29 // トークンの内容を整形して表示します。 30 // preg_replaceで改行文字を可視化しています。 31 $content = preg_replace('/\R/', '\n', $token[1]); 32 33 printf( 34 "Line %-3d: %-20s %s\n", 35 $token[2], // 行番号 36 $tokenName, // トークン名 (例: T_FUNCTION) 37 $content // トークンの元のテキスト (例: "function") 38 ); 39 } else { 40 // トークンが文字列の場合、それは単一の記号です (例: ';', '(', ')') 41 printf("Symbol : '%s'\n", $token); 42 } 43 } 44 echo "--------------------------\n"; 45} 46 47// 解析対象のPHPコードをヒアドキュメントで定義します。 48$sampleCode = <<<'PHP' 49<?php 50namespace App; 51 52class Greeter 53{ 54 public function sayHello(string $name): void 55 { 56 echo "こんにちは、" . $name . "!"; 57 } 58} 59PHP; 60 61// 関数を実行して、サンプルコードを解析します。 62analyzePhpCode($sampleCode); 63
token_get_all()は、引数で与えられたPHPのソースコード文字列を、PHPが内部で解釈する際の最小単位である「トークン」の配列に分解して返す関数です。
第1引数の$codeには、解析対象となるPHPコードを文字列として指定します。サンプルコードでは、ヒアドキュメントで定義されたクラスのコードがこの引数に渡されています。第2引数の$flagsは解析の挙動を調整するためのものですが、通常は省略可能です。
戻り値は、分解されたトークンを要素とする配列です。この配列の各要素は、トークンの種類によって2つの形式に分かれます。一つは、キーワードや変数名などを表す3要素の配列で、[トークンID, トークンの文字列, 行番号]という構成になっています。サンプルコードではis_array()でこの形式を判別し、PHP 8.0から利用できるtoken_name()でトークンIDをT_FUNCTIONのような分かりやすい名前に変換して表示しています。もう一つは、;や(のような1文字の記号で、これはそのまま文字列として返されます。
このように、token_get_all()を使うことでPHPコードの構造をプログラムで詳細に分析できるため、コードのスタイルを自動で整えるフォーマッターや、文法的な問題を検出する静的解析ツールなどを開発する際に活用されます。
token_get_all関数が返す配列には、トークンの詳細情報を持つ配列と、記号を表す文字列が混在しています。そのため、ループ内で処理する際は、サンプルコードのようにis_array()を使って必ず型をチェックする必要があります。また、トークンIDを分かりやすい名前に変換するtoken_name()関数はPHP 8.0から追加された機能のため、それ以前のバージョンでは利用できません。この関数はコメントや空白もトークンとして返却するので、これらを無視したい場合はループ処理の中で明示的に除外する処理が必要です。正しくPHPコードとして解析させるためには、解析対象の文字列に<?php開始タグを含めることが重要です。