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

【PHP8.x】token_name()関数の使い方

token_name関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

token_name関数は、PHPのソースコードを構成する最小の単位である「トークン」の識別子(ID)を、人間が理解しやすいシンボリック名に変換する関数です。

PHPのプログラムコードは、コンパイラやインタープリタによって実行される前に、キーワード、変数名、演算子などの意味を持つ小さな要素に分解されます。これらの分解された要素が「トークン」と呼ばれます。通常、token_get_all()関数を使用すると、PHPのソースコードを解析し、これらのトークンを配列として取得できます。この際、各トークンには一意の数値IDが割り当てられます。

token_name()関数は、この数値IDを引数として受け取り、そのIDが具体的に何を意味するのかを示すシンボリックな文字列名(例えば、T_VARIABLEは変数を、T_IFif文のキーワードを表します)を返します。これにより、数値だけでは分かりにくいトークンの種類を、より直感的に把握することが可能になります。

この関数は、PHPコードの静的解析ツールや、独自のコード整形ツール、構文チェッカーなどを開発する際に特に役立ちます。例えば、特定の種類のトークンを検出して処理したり、コードの構造をプログラム的に分析したりする場合に利用されます。引数には整数型のトークンIDを1つ指定し、戻り値としてそのシンボリック名を文字列で返します。もし未知のトークンIDが与えられた場合は、与えられた数値IDをそのまま文字列として返します。

構文(syntax)

1$tokenName = token_name(T_STRING);

引数(parameters)

int $token

  • int $token: トークンIDを指定する整数

戻り値(return)

string

指定されたPHPのトークンIDに対応する名前を文字列として返します。

サンプルコード

PHPコードのトークンを解析して名前を取得する

1<?php
2
3/**
4 * PHPコードを解析し、各トークンの名前と内容を表示します。
5 * token_get_all() と token_name() 関数の基本的な使用方法を示します。
6 */
7function analyzePhpCodeTokens(): void
8{
9    // 解析するPHPサンプルコードを定義します。
10    // PHP_CODE はヒアドキュメントシンタックスです。
11    $sampleCode = <<<'PHP_CODE'
12<?php
13
14namespace Example;
15
16use DateTime;
17
18class TokenAnalyzer
19{
20    public const VERSION = '1.0'; // 定数の定義
21
22    private string $name;
23
24    public function __construct(string $name)
25    {
26        $this->name = $name;
27    }
28
29    /**
30     * 指定されたメッセージを出力します。
31     */
32    public function sayHello(string $message): void
33    {
34        // これはコメントです。
35        $currentTime = new DateTime();
36        echo "Hello, {$this->name}! " . $message . " at " . $currentTime->format('Y-m-d H:i:s') . "\n";
37    }
38}
39
40$analyzer = new TokenAnalyzer("Expert");
41$analyzer->sayHello("Welcome to PHP!");
42
43PHP_CODE;
44
45    echo "--- PHP コードトークン解析結果 ---\n\n";
46
47    // token_get_all() を使用してPHPコードをトークンに分解します。
48    // 各トークンは配列 (ID, テキスト, 行番号) または単一文字の文字列 (演算子など) です。
49    $tokens = token_get_all($sampleCode);
50
51    foreach ($tokens as $token) {
52        if (is_array($token)) {
53            // トークンが配列の場合、トークンID (int) を使用してトークンの名前 (string) を取得します。
54            $tokenId = $token[0];
55            $tokenName = token_name($tokenId); // token_name() の使用例
56            $tokenContent = $token[1];
57            $lineNumber = $token[2];
58
59            // 整形して出力します。
60            echo sprintf(
61                "行: %-4d | ID: %-4d | 名前: %-25s | 内容: '%s'\n",
62                $lineNumber,
63                $tokenId,
64                $tokenName,
65                str_replace(["\n", "\r", "\t"], ['\n', '\r', '\t'], $tokenContent) // 特殊文字を見やすく変換
66            );
67        } else {
68            // トークンが文字列の場合 (例: '{', '}', ';', '(', ')', '=')
69            // これらは組み込みのトークンであり、token_name() では処理できません。
70            echo sprintf(
71                "行: N/A  | ID: N/A  | 名前: %-25s | 内容: '%s'\n",
72                "オペレータ/区切り文字",
73                str_replace(["\n", "\r", "\t"], ['\n', '\r', '\t'], $token)
74            );
75        }
76    }
77
78    echo "\n--- 解析終了 ---\n";
79}
80
81// 関数を実行し、コード解析結果を表示します。
82analyzePhpCodeTokens();

このサンプルコードは、PHPコードがどのように小さな意味のある構成要素(トークン)に分解され、それぞれのトークンが何を意味するかを理解する方法を示しています。

token_get_all()関数は、与えられたPHPコードを「トークン」と呼ばれる要素の配列に分解します。これらのトークンは、その種類を示すID、実際のコード内容、およびコード中の行番号を含む配列として表現されるか、または単一の文字(例えば、{;などの区切り文字)として直接表現されます。

token_name()関数は、整数のトークンIDを引数として受け取り、そのIDに対応するトークンの名前(例えば「名前空間」「クラス」といった、より人間が理解しやすい文字列)を戻り値として返します。

サンプルコードでは、まずPHPのコードをtoken_get_all()でトークンに分解しています。その後、分解された各トークンが配列形式の場合(つまりIDを持つ場合)、そのIDをtoken_name()に渡してトークン名を取得し、内容や行番号と共に表示しています。単一文字のトークンは直接その文字が表示されます。

これにより、PHPがコードを内部的にどのように認識し、処理しているかの一端を視覚的に確認できます。

token_name()関数は、PHPコードを分析する際にtoken_get_all()関数で得られるトークンIDを、人間が理解しやすい名前に変換する役割を持ちます。特に重要なのは、全てのトークンがtoken_name()で名前を取得できるわけではないという点です。例えば、単一文字の演算子や区切り文字({, ), ;など)はトークンIDを持たず、直接その文字として扱われます。そのため、サンプルコードのようにis_array()関数を使ってトークンの種類を判別し、適切に処理を分岐させる必要があります。この関数群は、主にコードの静的解析や自動整形ツールなどの開発で利用され、PHPコードの内部構造を深く理解する上で役立ちます。一般的なWebアプリケーション開発で直接使用する機会は少ないですが、言語仕様を理解する上で有用です。

PHPトークンを解析し、名前を表示する

1<?php
2
3/**
4 * この関数は、指定されたPHPコードをトークン化し、その結果を表示します。
5 * PHPにおける「トークン」とは、コードを構成する最小の意味単位(キーワード、変数名、演算子など)を指します。
6 * `token_name()` 関数は、これらのトークンに割り当てられた内部の数値IDを、人間が読める文字列名に変換します。
7 *
8 * @param string $code 解析するPHPコード文字列。
9 */
10function demonstrateTokenization(string $code): void
11{
12    echo "--- 解析対象のPHPコード ---\n";
13    echo $code . "\n\n";
14    echo "--- トークン解析結果 ---\n";
15
16    // token_get_all() 関数を使用して、PHPコードをトークンの配列に分解します。
17    // 各トークンは、その種類、値、出現行番号を含む配列、または単一文字(演算子など)として返されます。
18    $tokens = token_get_all($code);
19
20    foreach ($tokens as $token) {
21        if (is_array($token)) {
22            // トークンが配列の場合(例: T_VARIABLE, T_STRING, T_ECHO など)
23            $tokenId = $token[0];       // トークンを識別する数値ID
24            $tokenName = token_name($tokenId); // token_name() を使用してIDを可読な名前に変換
25            $tokenValue = $token[1];    // トークンの実際の文字列値(字句)
26            $lineNumber = $token[2];    // トークンが出現した行番号
27
28            echo sprintf(
29                "ID: %-4s (%s), Value: '%-15s', Line: %d\n",
30                $tokenId,
31                $tokenName,
32                $tokenValue,
33                $lineNumber
34            );
35        } else {
36            // トークンが単一文字の場合(例: {, }, ;, +, = など、多くの演算子や区切り文字)
37            // この場合、IDは文字コード(ASCII/Unicode値)として扱われることがあります。
38            echo sprintf(
39                "ID: %-4s (operator), Value: '%-15s', Line: N/A\n",
40                ord($token), // 文字の数値表現
41                $token
42            );
43        }
44    }
45}
46
47// 解析するPHPコードの例
48$samplePhpCode = <<<'EOD'
49<?php
50/**
51 * PHPトークンのサンプルです。
52 */
53$name = "山田太郎"; // 変数定義
54echo "こんにちは、" . $name . "さん!"; // 文字列結合と出力
55EOD;
56
57// 関数を実行し、PHPコードがどのようにトークンに分解されるかを確認します。
58demonstrateTokenization($samplePhpCode);
59
60?>

PHPにおける「トークン」とは、プログラムのソースコードを構成する最小の意味単位を指します。例えば、変数名、キーワード(echoなど)、演算子(=.など)などがこれに該当し、PHPインタプリタがコードを解釈する際に最初に分解される要素です。

token_name関数は、PHP 8で利用可能な機能で、これらのトークンに割り当てられた内部的な数値IDを、人間が理解しやすい文字列名に変換するために使用されます。この関数は引数として整数の$token IDを受け取り、そのIDに対応するトークン名を文字列として返します。

提供されたサンプルコードでは、まずtoken_get_all()関数を用いて指定されたPHPコードをトークンの配列に分解しています。この配列には、トークンの種類、実際の値、行番号などの情報が含まれます。ループ処理の中で、token_name()関数が各トークンの数値ID($tokenId)を受け取り、「T_VARIABLE」や「T_STRING」といった具体的なトークン名に変換しています。これにより、コードの各部分がPHPの内部でどのように識別されているかを、視覚的に確認できるようになります。特に、変数名や文字列リテラルなどが、それぞれ特定のトークンとして扱われている様子が分かります。

token_name関数は、token_get_all関数で得られるPHPコードトークンの「数値ID」を、T_VARIABLEのような「人間が読める名前」に変換する際に使用します。

ただし、PHPコードをトークン分解すると、{;などの単一文字の記号もトークンとして出現します。これらには数値IDがないため、token_name関数は直接適用できません。サンプルコードのようにis_array()でトークンの種類を判別し、配列形式のトークン(数値IDを持つもの)にのみtoken_name関数を適用することが重要です。

この機能は、PHPの内部動作を理解したり、コード解析ツールを作成する際に役立つ専門的なものです。一般的なWebアプリケーション開発で直接利用する機会はほとんどありませんが、PHPの構文解析の仕組みを知る上で非常に有益です。

関連コンテンツ

関連IT用語

関連プログラミング言語