はじめに
PHP8で登場した PhpToken
クラス は、従来の token_get_all()
関数をオブジェクト指向的に扱えるようにした新機能です。PhpToken::tokenize()
メソッドを使えば、ソースコードをトークン単位で分割し、各トークンを PhpToken
オブジェクトとして扱うことができます。
この記事では、上級試験で頻出の「PhpToken::tokenize()の動作」について、実際のコード例と出力結果をもとに整理します。
目次
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
のようにアクセスできます。
まとめ
PhpToken
は PHP8からの新クラス。PhpToken::tokenize()
でソースをトークンごとのオブジェクト配列に分割できる。- 出力例のように、トークン名や内容を
getTokenName()
とtext
で比較可能。 - 上級試験では、「
token_get_all()
のOOP版である」という理解が重要。