【PHP8.x】PhpToken::lineプロパティの使い方
lineプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
lineプロパティは、PhpTokenオブジェクトが表すPHPソースコードのトークンが、何行目に出現するかを示す整数値を保持するプロパティです。このプロパティは、PHP 8で導入されたPhpTokenクラスの重要な要素の一つです。
PhpTokenクラスは、PHPのソースコードを解析し、プログラムを構成する最小単位である「トークン」として表現するために使用されます。例えば、キーワード(ifやfunction)、演算子(+や=)、変数名、文字列リテラルなどがそれぞれ一つのトークンとして扱われます。
lineプロパティは、各トークンが元のソースコードのどの行に位置しているかの情報を提供します。この行番号は、ソースコードの最初の行を1として数えられ、各トークンが出現する最初の文字が属する行を指します。
このプロパティは、PHPコードを分析するツールや、デバッグ時にエラーが発生した箇所を特定するのに非常に役立ちます。例えば、カスタムリンター(コード品質チェッカー)や構文ハイライター、エラー報告システムなどを開発する際に、特定のトークンやエラーがコードのどの行にあるかを正確にユーザーに伝えるためにlineプロパティの値が利用されます。これにより、開発者は問題の場所を迅速に特定し、効率的なデバッグやコード修正を行うことができます。
構文(syntax)
1<?php 2 3$code = '<?php 4 echo "Hello"; 5?>'; 6 7$tokens = PhpToken::tokenize($code); 8 9// 最初のトークン(<?php)の行番号にアクセス 10echo $tokens[0]->line; 11 12// 2番目のトークン(改行)の次のトークン(echo)の行番号にアクセス 13echo $tokens[2]->line; 14 15?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このプロパティは、トークンが定義されているソースコードの行番号を整数値で返します。
サンプルコード
PHPトークンの行番号を取得・表示する
1<?php 2 3/** 4 * 指定されたPHPコード文字列を解析し、各トークンの行番号と内容を出力します。 5 * 6 * この関数は、PHPコード内の各要素(キーワード、変数、演算子など)が 7 * ソースコードのどの行に存在するかを初心者にも分かりやすく「送信」 8 * (=表示)する例です。 9 * PhpToken::line プロパティを使用して、トークンの行番号を取得します。 10 * 11 * @param string $phpCode 解析するPHPコード文字列 12 * @return void 13 */ 14function analyzeAndSendTokenLines(string $phpCode): void 15{ 16 // PhpToken::tokenize() を使用して、PHPコードをトークンに分解します。 17 // この関数はPHP 8以降で利用可能な新しいトークナイザーです。 18 $tokens = PhpToken::tokenize($phpCode); 19 20 echo "--- PHPコード解析結果 ---\n"; 21 22 // 各トークンをループ処理します。 23 foreach ($tokens as $token) { 24 // PhpToken::tokenize() は、PhpTokenオブジェクトの配列、 25 // または単一文字の演算子などの文字列トークンを返します。 26 // ここでは、行番号プロパティを持つPhpTokenオブジェクトに焦点を当てます。 27 if ($token instanceof PhpToken) { 28 // トークンの行番号 (PhpToken::line) と、トークンの内容 (text) を取得し、出力します。 29 // これが「php line 送信」の具体的な例となります。 30 // PhpToken::tokenName プロパティはPHP 8.0以降で利用可能です。 31 echo sprintf("行: %-4d | タイプ: %-20s | 内容: %s\n", 32 $token->line, // トークンが始まる行番号 33 $token->tokenName, // トークンの種類名 (例: T_VARIABLE, T_STRING) 34 trim($token->text) // トークンの内容 (余分な空白を除去) 35 ); 36 } 37 // 文字列トークン(例: '{', '}', ';' など)はPhpTokenオブジェクトではないため、 38 // line プロパティを持ちません。そのため、ここでは表示しません。 39 } 40 echo "------------------------\n"; 41} 42 43// 解析するサンプルPHPコードを用意します。 44// ヒアドキュメント構文 (<<<EOD ... EOD;) を使用して、複数行の文字列を定義します。 45$sampleCode = <<<'EOD' 46<?php 47 48namespace App\Utility; 49 50/** 51 * 簡易ユーティリティクラス 52 */ 53class MyUtility 54{ 55 const VERSION = '1.0'; // クラス定数 56 57 public function greet(string $name): string 58 { 59 // ユーザー名を含む挨拶メッセージを生成 60 $message = "Hello, {$name}! Welcome to PHP " . PHP_VERSION . "."; 61 return $message; // メッセージを返す 62 } 63} 64EOD; 65 66// 上で定義した関数を実行し、サンプルコードの解析結果(行番号とトークン情報)を 67// 標準出力に「送信」(出力)します。 68analyzeAndSendTokenLines($sampleCode);
PHP 8で導入されたPhpTokenクラスは、PHPのコードを「トークン」と呼ばれる小さな部品に分解し、それぞれの情報を詳細に取得するための機能を提供します。このPhpTokenクラスが持つlineプロパティは、各トークンが元のPHPコードの何行目から始まるかを示す整数値を取得するために使用されます。このプロパティには引数はなく、戻り値は常にint型で、行番号を表します。
提供されたサンプルコードでは、PhpToken::tokenize()メソッドを使って指定されたPHPコード文字列をトークンに分解しています。その後、分解された各トークンがPhpTokenオブジェクトである場合に、$token->lineプロパティを利用してそのトークンの行番号を取得しています。取得した行番号は、トークンの種類や内容とともに、画面に「出力」(または「送信」)されます。これは、どのコード要素がソースコードのどの行に存在するかを正確に把握し、表示する具体的な例となります。このように、PhpToken::lineは、PHPコードの構造をプログラムから解析し、その位置情報を特定する際に非常に役立つプロパティです。
このサンプルコードはPHP 8.0以降の環境でのみ動作します。PhpTokenクラスはPHP 7.x以前では利用できませんのでご注意ください。また、PhpToken::tokenize()関数は、PhpTokenオブジェクトと単一文字の文字列トークン(例えば、{や;など)の両方を返します。lineプロパティはPhpTokenオブジェクトにのみ存在するため、if ($token instanceof PhpToken)のように型を確認してからアクセスするようにしてください。これにより、エラーを防ぎ、意図しない挙動を回避できます。サンプルコードにおける「送信」という表現は、解析結果を標準出力に「表示する」ことを意味しており、外部システムへのデータ送信とは異なります。この点を理解することで、コードの目的が明確になります。
PHPトークン行番号を通知する
1<?php 2 3/** 4 * PHPコードを解析し、各トークンの行番号を通知します。 5 * 6 * この関数は、PHP 8で導入されたPhpToken::lineプロパティを使用して、 7 * 指定されたPHPコードスニペット内の各トークンの開始行番号を取得し、表示する方法を示します。 8 * システムエンジニアを目指す方にとって、コードの構造やエラー箇所の特定に役立つ情報です。 9 * 10 * @param string $phpCode 解析するPHPコードを含む文字列。 11 * @return void 12 */ 13function notifyTokenLines(string $phpCode): void 14{ 15 // PHPコード文字列をトークン化します。 16 // PhpToken::tokenize()は、PhpTokenオブジェクトの配列を返します。 17 // 各PhpTokenオブジェクトは、コードの個々の要素(キーワード、変数名、演算子など)を表します。 18 $tokens = PhpToken::tokenize($phpCode); 19 20 echo "--- PHP コード行番号通知 ---\n"; 21 22 // 各トークンをループし、その行番号と詳細情報を表示します。 23 foreach ($tokens as $token) { 24 // PhpToken::lineプロパティは、現在のトークンが開始する行番号(int型)を返します。 25 // PhpToken::nameプロパティは、トークンのタイプ名(例: T_NAMESPACE, T_CLASSなど)を返します。 26 // 匿名トークン(例: '{', ';', '=')の場合はnullになるため、その際はテキストを表示します。 27 // PhpToken::textプロパティは、トークン自身の文字列値(例: "namespace", "MyClass"など)を返します。 28 echo sprintf( 29 "行 %d: タイプ '%s', テキスト '%s'\n", 30 $token->line, 31 $token->name ?? $token->text, // タイプ名がなければトークンテキストを表示 32 $token->text 33 ); 34 } 35 echo "--- 通知終了 ---\n"; 36} 37 38// 解析するPHPのサンプルコード。 39// ヒアドキュメント構文を使用し、複数行のコードを簡潔に定義します。 40$sampleCode = <<<'PHP_CODE' 41<?php 42 43namespace App\Service; 44 45// これは単一行コメントです 46class UserProcessor 47{ 48 private const DEFAULT_LIMIT = 50; // 定数の定義 49 50 /** 51 * ユーザーデータを処理するメソッド。 52 * 53 * @param array $userData 処理するユーザーデータの配列 54 * @return int 処理されたユーザーの数 55 */ 56 public function process(array $userData): int 57 { 58 $count = count($userData); 59 if ($count > self::DEFAULT_LIMIT) { 60 echo "警告: 処理データが制限を超えています。\n"; 61 return -1; // エラーを示す 62 } 63 return $count; // 正常に処理された数を返す 64 } 65} 66PHP_CODE; 67 68// 定義した関数を実行し、サンプルコードのトークン行情報を通知します。 69notifyTokenLines($sampleCode); 70 71?>
このサンプルコードは、PHP 8で導入されたPhpToken::lineプロパティを利用し、PHPコード内の各要素(トークン)の開始行番号を取得し通知する方法を、システムエンジニアを目指す初心者向けに解説しています。コードの構造理解やエラー箇所の特定に大変役立つ機能です。
notifyTokenLines関数は、引数として解析したいPHPコード文字列(string型)を受け取ります。この関数は値を返しません(void)。内部では、PhpToken::tokenize()メソッドを使用して、与えられたPHPコードを文法上の最小単位であるトークンの配列に分解します。この分解された各トークンはPhpTokenオブジェクトとして表現されます。
そして、それぞれのPhpTokenオブジェクトが持つlineプロパティを参照することで、そのトークンがPHPコードの何行目から始まるかを示す整数値(int型)を取得できます。このプロパティは引数を持ちません。サンプルコードでは、このlineプロパティを使って、各トークンの行番号、種類、そして実際のテキスト内容を分かりやすく画面に出力し、コード全体の行情報を通知しています。この情報により、PHPコードの特定の行に存在する要素を迅速に把握することが可能になります。
このサンプルコードはPHP 8以降の環境でのみ動作します。PhpTokenクラスはPHP 8で導入された新機能のため、古いPHPバージョンでは実行できません。$token->lineプロパティは、解析対象のPHPコード内で各トークンが開始する行番号を整数で返します。これは、コード解析ツールを作成したり、プログラムのエラー発生位置を特定したりする際に非常に有用です。PhpToken::tokenize()関数は、与えられたPHPコード文字列を個々の言語要素であるトークンの配列に変換するため、入力コードが有効であることを確認して利用してください。