【PHP8.x】PhpToken::getTokenName()メソッドの使い方
getTokenNameメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getTokenNameメソッドは、PhpTokenクラスに属し、PHPコードの最小単位である「トークン」の種類を、人間が読みやすい文字列として取得するために実行するメソッドです。PHP 8で導入されたPhpTokenクラスは、token_get_all()関数が返すトークン情報をオブジェクトとしてカプセル化し、各トークンの詳細な情報を提供します。このgetTokenNameメソッドを呼び出すと、対象のPhpTokenオブジェクトが表すトークンの識別名(例えばT_STRINGやT_LNUMBERなど)を文字列として返します。これにより、数値のトークンIDだけでは分かりにくいトークンの種類を、具体的な名前で簡単に把握できるようになります。例えば、$token->getTokenName()のように使用することで、そのトークンが文字列リテラルなのか、整数値なのか、あるいは予約語なのかといった情報をデバッグ時や構文解析処理の中で効率的に判別することが可能になります。システムエンジニアを目指す方々がPHPの内部動作や構文解析の仕組みを理解する上で、このメソッドは非常に有用なツールとなるでしょう。
構文(syntax)
1<?php 2 3$code = '<?php echo "Hello World";'; 4$tokens = PhpToken::tokenize($code); 5 6// 最初のトークン(例えば '<?php')を取得し、その名前を取得する例 7if (!empty($tokens)) { 8 $firstToken = $tokens[0]; 9 $tokenName = $firstToken->getTokenName(); 10 echo "取得したトークンの名前: " . $tokenName . PHP_EOL; 11} 12 13?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
?string
このメソッドは、現在のトークンを表す文字列を返します。トークンが識別子、キーワード、リテラルなどの場合、その名前が返されます。
サンプルコード
PHPトークン名を取得する
1<?php 2 3/** 4 * 指定されたPHPコードをトークンに分解し、各トークンの名前と情報を表示するサンプルです。 5 * PhpToken::getTokenName() メソッドの使用例を示します。 6 * 7 * @param string $code 分析するPHPコードの文字列 8 */ 9function analyzePhpCodeTokens(string $code): void 10{ 11 echo "--- PHPコードトークン分析開始 ---" . PHP_EOL; 12 13 // PhpToken::tokenize() はPHPコードを構文解析し、 14 // PhpToken オブジェクトの配列(トークンリスト)を返します。 15 $tokens = PhpToken::tokenize($code); 16 17 foreach ($tokens as $token) { 18 // getTokenName() はトークンに対応する名前を返します。 19 // 例: 'T_VARIABLE', 'T_STRING' など。 20 // 単一文字の演算子や記号(例: '=', ';', '(' など)のように、 21 // PHPの内部で特定の名前を持たないトークンの場合は null を返します。 22 $tokenName = $token->getTokenName(); 23 24 // トークンの詳細情報を表示します。 25 // id: トークンを識別する数値ID (T_VARIABLEなどの定数値、または文字のASCII値) 26 // name: getTokenName()で取得したトークンの名前 (nullの場合は「名前なし」と表示) 27 // text: 実際のソースコード中のトークンの文字列 28 // line: トークンが出現する行番号 29 echo sprintf( 30 "ID: %-5s | 名前: %-25s | 値: '%-15s' | 行: %s" . PHP_EOL, 31 $token->id, 32 $tokenName ?? '(名前なし)', 33 $token->text, 34 $token->line 35 ); 36 } 37 38 echo "--- PHPコードトークン分析終了 ---" . PHP_EOL; 39} 40 41// 分析対象とするPHPコードの例 42$sampleCode = <<<'CODE' 43<?php 44$greeting = "Hello, PhpToken!"; // 変数宣言と文字列 45if ($greeting !== null) { 46 echo $greeting; 47} 48CODE; 49 50// 上記のサンプルコードを分析する関数を実行します。 51analyzePhpCodeTokens($sampleCode); 52 53?>
このサンプルコードは、PHP 8で導入されたPhpTokenクラスと、そのgetTokenName()メソッドの使用例を示しています。
PhpTokenクラスは、PHPのソースコードを文法上の最小単位である「トークン」に分解する機能を提供します。具体的には、PhpToken::tokenize()メソッドで指定されたPHPコードがトークンの配列に変換されます。
getTokenName()メソッドは、この配列内の各PhpTokenオブジェクトに対して呼び出され、そのトークンがどのような種類であるかを示す名前(例えば、変数を示す'T_VARIABLE'や文字列を示す'T_STRING'など)を返します。このメソッドは引数を取りません。戻り値は文字列(string)またはnullです。例えば、単一文字の演算子(=)や区切り記号(;)のように、PHP内部で特定の名前が定義されていないトークンの場合はnullが返されます。
サンプルコードでは、PHPコードをPhpToken::tokenize()でトークンに分解し、それぞれのトークンからgetTokenName()を使って名前を取得しています。そして、取得したトークン名、ID、元のコード上の値、そして出現する行番号を整形して表示することで、PHPのコードが内部的にどのように解釈され、最小単位に分けられているかを視覚的に理解することができます。このメソッドは、PHPのコード分析や構文解析を行うツール開発の基礎として活用されます。
PhpToken::getTokenName()メソッドは、全てのトークンに対して名前を返すわけではありません。単一文字の演算子や記号(例えば;や(など)はPHPの内部で特定の名前を持たないため、nullが返されます。サンプルコードのように?? '(名前なし)'でnullの場合を適切に処理することが重要です。
このPhpTokenクラスはPHP 8で導入された比較的新しい機能で、主にコードの静的解析や自動整形ツールの開発といった特殊な用途で使われます。通常のWebアプリケーション開発で直接利用する機会は少ないですが、PHPの構文解析の仕組みを理解する上で非常に役立ちます。利用するPHPのバージョンが8以上であることを確認してください。
PHPトークン名を取得する
1<?php 2 3/** 4 * PHPコード文字列をトークンに分解し、各トークンの名前と内容を表示します。 5 * PhpToken::getTokenName() メソッドの使用例を、システムエンジニアを目指す初心者向けに示します。 6 * 7 * @param string $code PHPコード文字列 8 */ 9function analyzeAndDisplayTokens(string $code): void 10{ 11 echo "--- トークン解析開始 ---\n"; 12 echo "解析対象コード:\n"; 13 echo "```php\n" . $code . "\n```\n\n"; 14 15 // PhpToken::tokenize() は、指定されたPHPコード文字列をPhpTokenオブジェクトの配列に変換します。 16 // これはPHP 8以降で利用可能な、コードをトークンに分解するモダンな方法です。 17 $tokens = PhpToken::tokenize($code); 18 19 echo "解析結果:\n"; 20 echo "--------------------------------------------------------\n"; 21 echo sprintf("%-5s | %-15s | %s\n", "ID", "Name", "Text"); 22 echo "--------------------------------------------------------\n"; 23 24 // 各トークンについてループし、その詳細情報(ID、名前、テキスト)を表示します。 25 foreach ($tokens as $token) { 26 // getTokenName() メソッドは、トークンのシンボリック名(例: 'T_STRING', 'T_VARIABLE' など)を返します。 27 // 特定のトークン(例: '{', '}', ';', 文字列リテラル、数値リテラル)は名前を持たず、null を返します。 28 // null の場合は、`?? 'N/A'` を使って 'N/A'(Not Applicable)と表示します。 29 $tokenName = $token->getTokenName() ?? 'N/A'; 30 31 // text プロパティは、そのトークンが表す実際の文字列内容(例: 'echo', '$myVariable')です。 32 $tokenText = $token->text; 33 34 // 出力を見やすくするため、改行文字はエスケープして表示します。 35 echo sprintf( 36 "%-5d | %-15s | %s\n", 37 $token->id, // トークンID (T_STRINGなどの整数値、または単一文字のASCII値) 38 $tokenName, 39 str_replace(["\n", "\r"], ['\n', '\r'], $tokenText) 40 ); 41 } 42 echo "--------------------------------------------------------\n"; 43 echo "--- トークン解析終了 ---\n"; 44} 45 46// PhpToken::getTokenName() の動作を示すためのPHPサンプルコードを定義します。 47$sampleCode = <<<'PHP_CODE' 48<?php 49// これはコメントです 50$myVariable = "Hello, PHP 8!"; 51if (true) { 52 echo $myVariable; 53} 54PHP_CODE; 55 56// 定義した関数を呼び出し、サンプルコードのトークン解析を実行します。 57analyzeAndDisplayTokens($sampleCode); 58 59?>
PHP 8から導入されたPhpTokenクラスのgetTokenName()メソッドは、PHPコードの構文解析において、コードを構成する最小単位である「トークン」の種類を文字列で取得する機能を提供します。このメソッドは引数を必要とせず、戻り値はstring型またはnullです。
具体的には、例えば変数を示すトークンからはT_VARIABLE、キーワードを示すトークンからはT_ECHOのようなシンボリック名が文字列として返されます。しかし、{や}、;といった単一の記号、あるいは数値や文字列リテラルそのものなど、PHPが特別なシンボリック名を持たないと判断するトークンに対してはnullが返されます。
提供されたサンプルコードでは、まずPhpToken::tokenize()関数を使ってPHPコード文字列を個々のトークンに分解しています。その後、分解された各トークンに対してgetTokenName()を呼び出し、そのトークンの種類と内容を表示しています。getTokenName()がnullを返した場合は、'N/A'と表示されるよう処理されており、どのトークンが名前を持たないかを確認できます。この機能は、PHPコードの構造をプログラム的に分析し、理解するための基盤として活用されます。
PhpToken::getTokenName()メソッドは、PHP 8以降で導入されたコード解析機能です。このメソッドは、トークンの種類を示すシンボリックな名前を返しますが、特定の記号(例: {、}、;)やリテラル(文字列、数値)のトークンに対してはnullが返される点に注意が必要です。そのため、サンプルコードのように?? 'N/A'を用いてnull時の表示を補完するなど、nullに対する適切な処理を必ず実装してください。この機能は、コードの静的解析や開発ツールの作成に主に利用され、PHPの内部的な動作理解に役立ちます。古いPHPバージョンでは使用できないため、利用するPHPのバージョンを必ずご確認ください。