【PHP8.x】token_name()関数の使い方
token_name関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
token_name関数は、PHPのソースコードを構成する最小の単位である「トークン」の識別子(ID)を、人間が理解しやすいシンボリック名に変換する関数です。
PHPのプログラムコードは、コンパイラやインタープリタによって実行される前に、キーワード、変数名、演算子などの意味を持つ小さな要素に分解されます。これらの分解された要素が「トークン」と呼ばれます。通常、token_get_all()関数を使用すると、PHPのソースコードを解析し、これらのトークンを配列として取得できます。この際、各トークンには一意の数値IDが割り当てられます。
token_name()関数は、この数値IDを引数として受け取り、そのIDが具体的に何を意味するのかを示すシンボリックな文字列名(例えば、T_VARIABLEは変数を、T_IFはif文のキーワードを表します)を返します。これにより、数値だけでは分かりにくいトークンの種類を、より直感的に把握することが可能になります。
この関数は、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の構文解析の仕組みを知る上で非常に有益です。