【PHP8.x】T_STRING定数の使い方
T_STRING定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
T_STRING定数は、PHPコードの解析時に使用されるトークンの一つを表す定数です。PHPインタプリタがPHPスクリプトを実行する際、まずソースコードを意味のある最小単位に分解します。この分解された単位を「トークン」と呼び、T_STRINGはそのトークンの種類を示す識別子の一つです。
具体的には、T_STRINGは変数名、関数名、クラス名、メソッド名、定数名、名前空間名、あるいは予約語の一部など、プログラムを構成する基本的な「単語」にあたる部分を指します。例えば、$variableという変数名、myFunction()という関数名、MyClassというクラス名などがT_STRINGとして認識されます。これらは文字列リテラル(例: "Hello, World!"のようにクォーテーションで囲まれた文字列)とは異なり、プログラムの構造やロジックを構成する要素として扱われます。
このT_STRING定数は、PHPの組み込み関数であるtoken_get_all()や、PHP 8以降で利用可能なPhpToken::tokenize()メソッドを使用してPHPコードをトークン列に変換する際に、トークンのタイプとして返されます。PHPコードの静的解析ツールや、独自のコードジェネレータ、整形ツールなどを開発する際に、特定の識別子やキーワードを識別するためにT_STRINGのようなトークン定数が利用されます。この定数を理解することは、PHPが内部でどのようにコードを解釈し、処理しているかを知る上で基礎的な概念となります。
構文(syntax)
1$variableName = 'value';
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP8 str_contains で文字列を含まないか調べる
1<?php 2 3/** 4 * 指定された文字列が特定のサブストリングを含まないかを判定します。 5 * 6 * PHP 8.0 以降で導入された str_contains() 関数を利用して、 7 * 効率的に部分文字列の有無をチェックします。 8 * 9 * @param string $haystack 検索対象となる元の文字列。 10 * @param string $needle 検索する部分文字列。 11 * @return bool 指定された文字列が部分文字列を含まない場合に true、含む場合に false を返します。 12 */ 13function stringDoesNotContain(string $haystack, string $needle): bool 14{ 15 // str_contains() は PHP 8.0 で導入されました。 16 // $haystack が $needle を含む場合は true、含まない場合は false を返します。 17 // 「含まない」ことをチェックするため、str_contains() の結果を否定します。 18 return !str_contains($haystack, $needle); 19} 20 21// --- サンプルコードの実行例 --- 22 23$mainString = "こんにちは、PHP 8 の世界へようこそ!"; 24$presentSubstring = "PHP 8"; // 元の文字列に含まれる部分文字列 25$absentSubstring = "Python"; // 元の文字列に含まれない部分文字列 26$emptySubstring = ""; // 空の部分文字列 27 28// 例 1: 部分文字列が含まれるケース 29if (stringDoesNotContain($mainString, $presentSubstring)) { 30 echo "1. '{$mainString}' は '{$presentSubstring}' を含みません。(このメッセージは表示されません)\n"; 31} else { 32 echo "1. '{$mainString}' は '{$presentSubstring}' を含みます。\n"; 33} 34 35// 例 2: 部分文字列が含まれないケース 36if (stringDoesNotContain($mainString, $absentSubstring)) { 37 echo "2. '{$mainString}' は '{$absentSubstring}' を含みません。\n"; 38} else { 39 echo "2. '{$mainString}' は '{$absentSubstring}' を含みます。(このメッセージは表示されません)\n"; 40} 41 42// 例 3: 空の部分文字列のケース 43// str_contains() は空の文字列が常に含まれると見なすため、!str_contains() は false を返します。 44if (stringDoesNotContain($mainString, $emptySubstring)) { 45 echo "3. '{$mainString}' は空の文字列を含みません。(このメッセージは表示されません)\n"; 46} else { 47 echo "3. '{$mainString}' は空の文字列を含みます。\n"; 48} 49 50$emptyMainString = ""; 51if (stringDoesNotContain($emptyMainString, $emptySubstring)) { 52 echo "4. 空の文字列は空の文字列を含みません。(このメッセージは表示されません)\n"; 53} else { 54 echo "4. 空の文字列は空の文字列を含みます。\n"; 55}
このサンプルコードは、PHP 8.0以降で導入されたstr_contains()関数を活用し、指定された文字列が特定の部分文字列を含まないかを判定するstringDoesNotContain関数を定義しています。PHPで文字列の有無を効率的にチェックし、「含まない」という条件をシンプルに記述する方法を示しています。
stringDoesNotContain関数は、検索対象となる元の文字列を$haystack、検索したい部分文字列を$needleという二つの引数として受け取ります。内部ではまず、str_contains($haystack, $needle)を実行します。このstr_contains()関数は、$haystackが$needleを含む場合にtrueを、含まない場合にfalseを返します。当関数では「含まない」という条件を判定したいため、str_contains()の戻り値に対して!(論理否定)演算子を適用しています。これにより、最終的に元の文字列が部分文字列を含まない場合にtrueを、含む場合にfalseをブール値として返します。
実行例では、"こんにちは、PHP 8 の世界へようこそ!"という文字列を使用し、異なる部分文字列で動作を確認しています。例えば、"PHP 8"のように含まれる部分文字列に対してはfalseを、"Python"のように含まれない部分文字列に対してはtrueを返します。また、空の部分文字列""を検索した場合、str_contains()関数は空の文字列が常に含まれると見なすため、stringDoesNotContain関数はfalseを返します。この挙動は、元の文字列が空の場合でも同様です。
このサンプルコードはPHP 8.0以降で導入されたstr_contains()関数を基にしているため、古いPHPバージョンでは動作しませんのでご注意ください。str_contains()は部分文字列の大文字・小文字を厳密に区別して検索します。大文字・小文字を無視して判定したい場合は、mb_strtolower()関数などで事前に文字列を小文字に変換するなどの前処理が必要です。また、特に重要な注意点として、検索する部分文字列が空文字列の場合、str_contains()は常に含まれると判定するため、この関数はfalseを返します。この挙動は間違いやすいため、空文字列に対する期待する動作を把握し、必要に応じて条件分岐で対応してください。関数の戻り値は「指定された文字列が部分文字列を含まない場合にtrue」となることを理解して利用してください。
PHPコードのトークン分析とT_STRING/T_CONSTANT_ENCAPSED_STRINGの表示
1<?php 2 3/** 4 * PHPコードを分析し、そのコードがどのような「トークン」(字句)で構成されているかを表示します。 5 * システムエンジニアを目指す初心者が、PHPが内部でコードをどのように解釈するかを理解するのに役立ちます。 6 * 特に、識別子(変数名や関数名など)を表す「T_STRING」と、文字列リテラルを表す「T_CONSTANT_ENCAPSED_STRING」に注目します。 7 * 8 * @param string $phpCode 分析対象のPHPコード文字列。 9 * @return void 10 */ 11function analyzePhpCodeTokens(string $phpCode): void 12{ 13 // token_get_all() 関数は、与えられたPHPコード文字列を 14 // PHPの構文を構成する最小単位である「トークン」(字句)の配列に分解します。 15 $tokens = token_get_all($phpCode); 16 17 echo "PHPコードトークン分析結果:\n"; 18 echo "---------------------------------------------------------\n"; 19 20 foreach ($tokens as $token) { 21 // 各トークンは、[トークンID, 内容, 行番号] の配列か、 22 // あるいは単一の文字(演算子や括弧など)のいずれかです。 23 if (is_array($token)) { 24 $tokenId = $token[0]; // トークンの種類を示す内部ID 25 $tokenContent = $token[1]; // トークンの実際の文字列内容 26 $lineNumber = $token[2]; // そのトークンがコードの何行目にあるか 27 28 // token_name() 関数を使って、数値IDを人間が読めるトークン名に変換します。 29 $tokenName = token_name($tokenId); 30 31 // T_STRING は、変数名、関数名、クラス名、キーワードなど、 32 // PHPのコード内の「識別子」を表します。 33 if ($tokenId === T_STRING) { 34 printf("L%d: [%-20s] '%s' (識別子、変数名、関数名など)\n", $lineNumber, $tokenName, $tokenContent); 35 } 36 // T_CONSTANT_ENCAPSED_STRING は、シングルクォートまたは 37 // ダブルクォートで囲まれた「文字列リテラル」を表します。 38 // 例: "Hello, world!", 'PHP is great' 39 elseif ($tokenId === T_CONSTANT_ENCAPSED_STRING) { 40 printf("L%d: [%-20s] '%s' (固定文字列リテラル)\n", $lineNumber, $tokenName, $tokenContent); 41 } 42 // その他のトークンも表示して、コード全体がどのように分解されるかを示します。 43 else { 44 printf("L%d: [%-20s] '%s'\n", $lineNumber, $tokenName, $tokenContent); 45 } 46 } else { 47 // 単一文字のトークン(例: セミコロン `;`、括弧 `(`、演算子 `+` など) 48 printf("L: [%-20s] '%s'\n", "OPERATOR/PUNCTUATION", $token); 49 } 50 } 51 echo "---------------------------------------------------------\n"; 52} 53 54// 分析対象となるサンプルPHPコードを定義します。 55// このコードには、T_STRING(例: $message, greetUser)と 56// T_CONSTANT_ENCAPSED_STRING(例: "Hello", 'Greetings')の両方が含まれています。 57$sampleCode = <<<'EOD' 58<?php 59// T_STRING の例: $message, echo 60$message = "Hello, world!"; // T_CONSTANT_ENCAPSED_STRING の例 61echo $message; 62 63// T_STRING の例: function, greetUser, string, name, string, return, . (演算子) 64function greetUser(string $name): string 65{ 66 return 'Greetings, ' . $name . '!'; // T_CONSTANT_ENCAPSED_STRING の例 67} 68 69// T_STRING の例: $userName, greetUser 70$userName = "Alice"; 71echo greetUser($userName); 72EOD; 73 74// 上記のPHPコード文字列を analyzePhpCodeTokens 関数に渡して、トークン分析を実行します。 75analyzePhpCodeTokens($sampleCode);
このサンプルコードは、PHPがどのようにプログラムを解釈しているかを理解するため、与えられたPHPコードを「トークン」(字句)と呼ばれる最小単位に分解し、その種類を表示します。特に、token_get_all()関数を使用してコードを分析し、PHPの識別子を表すT_STRINGと、文字列リテラルを表すT_CONSTANT_ENCAPSED_STRINGの違いに焦点を当てています。T_STRINGは変数名や関数名、クラス名などプログラム内の名前を示し、T_CONSTANT_ENCAPSED_STRINGはシングルクォートまたはダブルクォートで囲まれた固定のテキスト文字列を表します。analyzePhpCodeTokens関数は、分析対象のPHPコード文字列を引数$phpCodeとして受け取り、その分析結果を画面に出力します。戻り値はvoidであるため、直接の値を返しません。このコードを通じて、システムエンジニアを目指す初心者は、PHPがコードを構成する要素をどのように識別しているかの基礎を学ぶことができます。
T_STRINGは変数名や関数名、クラス名などの識別子を表し、PHPコードの構造を構成する「部品名」と捉えてください。一方、T_CONSTANT_ENCAPSED_STRINGはシングルクォートやダブルクォートで囲まれた「固定の文字列データ」そのもので、プログラムが扱う具体的な「情報」を指します。この明確な区別を理解することは、PHPがコードをどのように解釈し、構文を構築しているかを深く理解する上で非常に重要です。token_get_all()関数は、主にコードの静的解析ツールやIDEの開発など、特殊な目的で利用されるため、一般的なアプリケーション開発で直接使うことは稀です。このサンプルコードは、PHPの字句解析の基本を教育的に学ぶために役立ちます。