《PHP8上級試験対策》PhpToken::tokenize()の挙動まとめ

  • URLをコピーしました!

はじめに

PHP8で登場した PhpToken クラス は、従来の token_get_all() 関数をオブジェクト指向的に扱えるようにした新機能です。PhpToken::tokenize() メソッドを使えば、ソースコードをトークン単位で分割し、各トークンを PhpToken オブジェクトとして扱うことができます。
この記事では、上級試験で頻出の「PhpToken::tokenize()の動作」について、実際のコード例と出力結果をもとに整理します。

キーワード: PhpToken / token_get_all / tokenize / トークン分割 / 静的メソッド / PHP8新機能

目次

PhpTokenクラスとは

PhpToken クラスは、PHP8で追加された 最終(final)クラス です。
従来の token_get_all() 関数のように、ソースコードを構文要素ごとの「トークン」に分割しますが、
配列ではなくオブジェクトの配列 として扱える点が大きな違いです。

final class PhpToken {
    public int $id;
    public string $text;
    public int $line;
    public int $pos;

    public static function tokenize(string $code, int $flags = 0): array {}
    public function getTokenName(): ?string {}
}

token_get_all() との違い

比較項目token_get_all()PhpToken::tokenize()
戻り値配列(連想配列+文字列)PhpTokenオブジェクトの配列
取得方法procedural(関数)object-oriented(メソッド)
トークン名取得token_name($id)$token->getTokenName()
PHPバージョンPHP4以降PHP8以降

実行例

<?php
declare(strict_types=1);
error_reporting(-1);

//コメント
$tokens = PhpToken::tokenize(file_get_contents(__FILE__));
foreach ($tokens as $t) {
    if (T_WHITESPACE !== $t->id && $t->getTokenName() !== $t->text) {
        echo "{$t->line}: {$t->getTokenName()} ('{$t->text}') \n";
    }
}

出力結果(代表例)

1: T_OPEN_TAG ('<?php
')
2: T_DECLARE ('declare')
2: T_STRING ('strict_types')
2: T_LNUMBER ('1')
3: T_STRING ('error_reporting')
3: T_LNUMBER ('1')
5: T_COMMENT ('//コメント')
6: T_VARIABLE ('$tokens')
6: T_STRING ('PhpToken')
6: T_DOUBLE_COLON ('::')
6: T_STRING ('tokenize')
6: T_STRING ('file_get_contents')
6: T_FILE ('__FILE__')
7: T_FOREACH ('foreach')
7: T_VARIABLE ('$tokens')
7: T_AS ('as')
7: T_VARIABLE ('$t')
8: T_IF ('if')
8: T_STRING ('T_WHITESPACE')
8: T_IS_NOT_IDENTICAL ('!==')
8: T_VARIABLE ('$t')
8: T_OBJECT_OPERATOR ('->')
8: T_STRING ('id')
9: T_ECHO ('echo')
9: T_VARIABLE ('$t')
9: T_OBJECT_OPERATOR ('->')
9: T_STRING ('line')

このように、各トークンが行番号とともに出力され、PhpToken::tokenize()token_get_all() の代替として正しく動作している ことが確認できます。

試験でのポイント

項目内容
✅ 出題傾向「PhpToken::tokenize() は token_get_all() の代替である」
✅ 機能理解各トークンを PhpToken オブジェクトとして扱う
✅ メソッドgetTokenName() でトークン名を取得
✅ 注意点戻り値は PhpToken オブジェクト配列である(配列ではない)

図解:PhpToken のイメージ

+----------------------------------------------------------------+
| PhpToken オブジェクト配列                                |
+----------------------------------------------------------------+
| [0] => PhpToken { id: T_OPEN_TAG, text: '<?php', line: 1 }    |
| [1] => PhpToken { id: T_DECLARE, text: 'declare', line: 2 }   |
| [2] => PhpToken { id: T_STRING, text: 'strict_types', line: 2 } |
| ...                                     |
+----------------------------------------------------------------+

各要素が PhpToken クラスのインスタンスとなっており、$token->id$token->text$token->line のようにアクセスできます。

まとめ

  • PhpTokenPHP8からの新クラス
  • PhpToken::tokenize() でソースをトークンごとのオブジェクト配列に分割できる。
  • 出力例のように、トークン名や内容を getTokenName()text で比較可能。
  • 上級試験では、「token_get_all() のOOP版である」という理解が重要。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次