Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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開始タグを含めることが重要です。

関連コンテンツ

関連プログラミング言語