【PHP8.x】PhpToken::is()メソッドの使い方
isメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
isメソッドは、現在のPhpTokenオブジェクトが特定の種類のトークンであるかどうかを判定するメソッドです。PHP 8で導入されたPhpTokenクラスは、PHPのソースコードを個々の最小単位であるトークンに分割する際に利用され、それぞれのトークン(例えばキーワード、演算子、文字列など)をオブジェクトとして表現します。このisメソッドは、コードを解析する際に、特定のトークンが期待する種類のものであるかを確認するために使用されます。
メソッドの引数には、判定したいトークンの種類を一つまたは複数指定できます。具体的には、PHPの内部定数であるトークンID(例: T_STRING)、または文字列として直接トークンの値(例: +、=、function)を指定します。これらを配列として渡すことも可能です。現在のPhpTokenオブジェクトの種類が、引数で指定されたいずれかの種類と一致する場合、このメソッドはtrueを返します。一致しない場合はfalseを返します。この機能により、PHPコードの構文解析や特定の要素の検索といった処理を、より直感的かつ効率的に行うことができます。
構文(syntax)
1<?php 2 3$code = '<?php $name = "PHP"; echo $name; ?>'; 4$tokens = PhpToken::tokenize($code); 5 6foreach ($tokens as $token) { 7 // このトークンがキーワード「echo」を表すT_ECHOトークンであるかを確認 8 if ($token->is(T_ECHO)) { 9 echo "Found an 'echo' keyword token: " . $token->text . "\n"; 10 } 11 12 // このトークンが変数(T_VARIABLE)または文字列(T_STRING)のいずれかであるかを確認 13 if ($token->is([T_VARIABLE, T_STRING])) { 14 echo "Found a variable or string token: " . $token->text . "\n"; 15 } 16} 17 18?>
引数(parameters)
int|string|array $kind
- int|string|array $kind: 比較するトークンの種類を指定します。
PhpToken::getTokenNames()で取得できるトークン名(文字列)、トークンID(整数)、または複数のトークンIDを配列で指定できます。
戻り値(return)
bool
このメソッドは、現在の PhpToken が指定されたトークン種別である場合に true を、そうでない場合に false を返します。
サンプルコード
PHPコードからnullキーワードを検出する
1<?php 2 3/** 4 * PhpToken::is() メソッドを使用して、与えられたPHPコード内の 'null' キーワード (T_NULL トークン) を検出する例です。 5 * 'php isnull' というキーワードに関連付けて、コード中の 'null' リテラルを見つける方法を示します。 6 * PhpToken クラスは PHP 8 で導入されました。 7 * 8 * @param string $code 分析対象のPHPコード文字列。 9 * @return void 10 */ 11function findNullKeywordsInCode(string $code): void 12{ 13 echo "--- 分析対象のPHPコード ---\n"; 14 echo str_replace("\n", "\n ", $code) . "\n\n"; // コードを見やすく整形 15 echo "--- 'null' キーワードの検出結果 ---\n"; 16 17 // PhpToken::tokenize() を使用して、PHPコードをトークンの配列に分解します。 18 // 各トークンは PhpToken オブジェクトとして扱われます。 19 $tokens = PhpToken::tokenize($code); 20 21 $foundNull = false; 22 foreach ($tokens as $token) { 23 // PhpToken::is() メソッドを使って、現在のトークンが特定の種類であるかを判定します。 24 // ここでは、'T_NULL' (nullキーワードを表す組み込み定数) であるかをチェックしています。 25 if ($token->is(T_NULL)) { 26 echo " 'null' キーワードが見つかりました。\n"; 27 echo " 値: '" . $token->text . "'\n"; // トークンの元のテキスト内容 (例: "null") 28 echo " 行: " . $token->line . "\n"; // トークンが見つかった行番号 29 echo " オフセット: " . $token->pos . "\n"; // コード内でのバイトオフセット 30 $foundNull = true; 31 } 32 } 33 34 if (!$foundNull) { 35 echo " 'null' キーワードは検出されませんでした。\n"; 36 } 37 echo "\n"; 38} 39 40// サンプルコードその1: 'null' キーワードを含む 41$sampleCode1 = <<<'PHP_CODE' 42<?php 43$a = null; 44$b = "test"; 45if ($a === null) { 46 echo "変数 \$a は null です。\n"; 47} 48function getValue(): ?string { 49 return null; 50} 51PHP_CODE; 52 53// サンプルコードその2: 'null' キーワードを含まない 54$sampleCode2 = <<<'PHP_CODE' 55<?php 56$x = 123; 57$y = "hello"; 58$z = array(); 59if (isset($x)) { 60 echo "変数 \$x は設定されています。\n"; 61} 62PHP_CODE; 63 64// 関数を実行して、それぞれのサンプルコードから 'null' キーワードを検出します。 65findNullKeywordsInCode($sampleCode1); 66findNullKeywordsInCode($sampleCode2);
PhpToken::is()メソッドは、PHP 8で導入されたPhpTokenクラスの機能で、個々のトークンが特定の種類であるかを判定します。このメソッドは、PhpToken::tokenize()でPHPコードをトークンに分解した際に得られる各トークンオブジェクトに対して使用されます。引数$kindには、判定したいトークンの種類を、T_NULLのような組み込み定数である整数値、または文字列、あるいはそれらの配列で指定します。現在のトークンが指定された種類と一致すればtrueを、一致しなければfalseをbool型で返します。
サンプルコードでは、「php isnull」というキーワードに関連して、PHPコード中のnullキーワード(T_NULLトークン)を検出する具体的な例を示しています。まずPhpToken::tokenize()でコードをトークンに分解し、その後、ループ内で各トークンに対し$token->is(T_NULL)と呼び出すことで、nullキーワードを特定しています。これにより、コード内の特定の要素を見つけ出し、その位置や内容を把握することが可能となり、PHPコードのより詳細な分析に活用できます。
PhpToken::is() メソッドは、PHP 8以降で利用できるコードの字句解析機能です。サンプルコードは、PHPコード内に「null」というキーワード(T_NULLトークン)が存在するかを検出するものです。
最も重要な注意点は、このメソッドが変数の中身がnullかどうかを判定するis_null()関数とは全く異なる点です。PhpToken::is()はソースコードの構造(字句)を分析する際に使い、is_null()はプログラム実行時の変数の値を確認します。混同しないよう注意してください。
引数にはT_NULLのようなPHPの組み込み定数(整数値)だけでなく、'T_STRING'のようなトークン名を文字列で指定したり、複数の種類を配列で渡したりすることも可能です。この機能は、コードの静的解析やリファクタリングツールの開発に役立ちます。
PHPトークンで「isset」風に存在チェックする
1<?php 2 3/** 4 * PHPコード文字列を解析し、指定されたトークンタイプ(または文字列リテラル)が存在するかどうかを確認します。 5 * 6 * PhpToken::is() メソッドは、現在のトークンが指定された種類であるか(例: T_VARIABLE, 'if' など)を真偽値で返します。 7 * このメソッドは、変数がセットされているかをチェックする isset() と同様に、 8 * 特定の構文要素がコード内に「存在する」かを判断するために利用できます。 9 * 10 * @param string $code 検証するPHPコード文字列。 11 * @param int|string|array $kind チェックするトークン種別(T_* 定数、文字列、またはそれらの配列)。 12 * @return bool 指定されたトークンタイプがコード内に存在すれば true、そうでなければ false。 13 */ 14function containsSpecificTokenKind(string $code, int|string|array $kind): bool 15{ 16 // PHPコードをトークンに分解します。 17 // PhpToken::tokenize() はPHP 8で追加された便利な関数です。 18 $tokens = PhpToken::tokenize($code); 19 20 foreach ($tokens as $token) { 21 // PhpToken::is() メソッドを使用して、現在のトークンが指定された種類であるかを確認します。 22 // 引数 $kind は、T_* 定数(例: T_VARIABLE)、文字列(例: '{')、またはそれらの配列を受け入れます。 23 if ($token->is($kind)) { 24 return true; // 指定された種類のトークンが見つかった場合は true を返します。 25 } 26 } 27 28 return false; // 指定された種類のトークンが見つからなかった場合は false を返します。 29} 30 31// --- サンプルPHPコード --- 32$samplePhpCode = <<<PHP 33<?php 34 35\$counter = 0; 36// isset() 関数を使って変数の存在をチェック 37if (isset(\$_GET['id'])) { 38 \$id = (int) \$_GET['id']; 39 echo "ID is: " . \$id; 40} else { 41 echo "ID is not set."; 42} 43 44for (\$i = 0; \$i < 5; \$i++) { 45 // ループ処理 46} 47 48// これは単一行コメントです。 49/* 50 * これは複数行コメントです。 51 */ 52PHP; 53 54echo "--- PHPコード内の特定のトークン存在チェック ---\n\n"; 55 56// 1. T_VARIABLE (変数) トークンが存在するかチェック 57if (containsSpecificTokenKind($samplePhpCode, T_VARIABLE)) { 58 echo "コードには変数が含まれています。\n"; 59} else { 60 echo "コードには変数が含まれていません。\n"; 61} 62 63// 2. 'isset' キーワード(文字列リテラル)が存在するかチェック 64// PhpToken::is() は文字列リテラルとしてキーワードや演算子も受け入れます。 65if (containsSpecificTokenKind($samplePhpCode, 'isset')) { 66 echo "コードには 'isset' キーワードが含まれています。\n"; 67} else { 68 echo "コードには 'isset' キーワードは含まれていません。\n"; 69} 70 71// 3. T_IF (ifキーワード) トークンが存在するかチェック 72if (containsSpecificTokenKind($samplePhpCode, T_IF)) { 73 echo "コードには 'if' キーワードが含まれています。\n"; 74} else { 75 echo "コードには 'if' キーワードは含まれていません。\n"; 76} 77 78// 4. 複数のトークンタイプを配列で指定してチェック (例: T_FOR または T_WHILE) 79if (containsSpecificTokenKind($samplePhpCode, [T_FOR, T_WHILE])) { 80 echo "コードには 'for' または 'while' ループが含まれています。\n"; 81} else { 82 echo "コードには 'for' または 'while' ループは含まれていません。\n"; 83} 84 85// 5. 存在しないトークンタイプをチェック (例: T_GOTO) 86if (!containsSpecificTokenKind($samplePhpCode, T_GOTO)) { 87 echo "コードには 'goto' キーワードは含まれていません。\n"; 88} else { 89 echo "コードには 'goto' キーワードが含まれています。\n"; 90} 91 92// 6. T_COMMENT (コメント) トークンが存在するかチェック 93if (containsSpecificTokenKind($samplePhpCode, T_COMMENT)) { 94 echo "コードにはコメントが含まれています。\n"; 95} else { 96 echo "コードにはコメントは含まれていません。\n"; 97} 98 99echo "\n--- チェック完了 ---\n"; 100 101?>
PHP 8で導入されたPhpTokenクラスは、PHPコードを細かい要素(トークン)に分解して扱う機能を提供します。その中のPhpToken::is()メソッドは、現在処理している個々のトークンが、引数で指定した種類と一致するかどうかを真偽値で判定します。
引数$kindには、PHPの構文要素を表す定数(例: 変数を表すT_VARIABLE、ifキーワードを表すT_IF)、特定の文字列(例: 'isset'、開き括弧を表す'{')、またはこれらの種類を複数指定した配列を渡すことができます。メソッドは、現在のトークンがこれらのいずれかと一致すればtrueを、一致しなければfalseを返します。
このサンプルコードは、PHPコード文字列全体をトークンに分解し、それぞれのトークンに対してPhpToken::is()を使って、特定の種類のトークン(例えば、変数、issetキーワード、if文、forやwhileループ、コメントなど)がコード内に存在するかどうかを確認しています。これは、変数がセットされているかを確認するisset()関数と同様に、コード内に特定の要素が「存在する」かをチェックする点で共通しています。コードの構造を分析したり、特定のキーワードや構文の使用状況を調べたりする際に活用できます。
PhpToken::is()はPHP 8で導入された機能のため、古いPHPバージョンでは動作しない点に注意が必要です。このメソッドは、PHPコードの内部構造を解析し、特定のトークンが存在するかを判定します。変数の存在をチェックするisset()関数とは用途が異なるため混同しないようにしてください。引数には、T_VARIABLEのようなPHP内部のトークン定数や、'isset'、'{'といったキーワードや記号の文字列リテラルも指定可能です。コメントや空白文字もトークンとして扱われるため、これらも検出対象となり得ます。この機能は、コードを実行せずに静的に解析するツールを開発する際に非常に有用です。