PhpTokenクラスについて調べた

2026-04-27
PHP

PHP: PhpToken - Manual

フーン…なんですかコレ?よくわからないので、使ってみよう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
$ php -r "var_dump(PhpToken::tokenize('<?php echo "Hello";'));"
array(5) {
[0]=>
object(PhpToken)#1 (4) {
["id"]=>
int(393)
["text"]=>
string(6) "<?php "
["line"]=>
int(1)
["pos"]=>
int(0)
}
[1]=>
object(PhpToken)#2 (4) {
["id"]=>
int(291)
["text"]=>
string(4) "echo"
["line"]=>
int(1)
["pos"]=>
int(6)
}
[2]=>
object(PhpToken)#3 (4) {
["id"]=>
int(396)
["text"]=>
string(1) " "
["line"]=>
int(1)
["pos"]=>
int(10)
}
[3]=>
object(PhpToken)#4 (4) {
["id"]=>
int(262)
["text"]=>
string(5) "Hello"
["line"]=>
int(1)
["pos"]=>
int(11)
}
[4]=>
object(PhpToken)#5 (4) {
["id"]=>
int(59)
["text"]=>
string(1) ";"
["line"]=>
int(1)
["pos"]=>
int(16)
}
}

あ〜、なるほど、字句解析の結果が見れるのか、完全に理解できました。

token_get_all() の代替らしいのですが、token_get_all()も多分使ったことないので、やってみよう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ php -r "var_dump(token_get_all('<?php echo "Hello";'));"
array(5) {
[0]=>
array(3) {
[0]=>
int(393)
[1]=>
string(6) "<?php "
[2]=>
int(1)
}
[1]=>
array(3) {
[0]=>
int(291)
[1]=>
string(4) "echo"
[2]=>
int(1)
}
[2]=>
array(3) {
[0]=>
int(396)
[1]=>
string(1) " "
[2]=>
int(1)
}
[3]=>
array(3) {
[0]=>
int(262)
[1]=>
string(5) "Hello"
[2]=>
int(1)
}
[4]=>
string(1) ";"
}

オブジェクトで返ってくるのか、配列で返ってくるのかの違いですね。つまり、どう考えてもPhpTokenクラス使うほうが良いですね。