PHP解析器代号

PHP是解释型语言。我们写的代码都要经过php给翻译成底层可执行的代码。如果程序中有php不能解析的语句,就会报Parse error的错误。

Parse error: syntax error, unexpected T_STRING

这里的T_STRING就是一个解析代号。

解析代号表

手册里列出了诸如下面这样的对应关系表:

T_ABSTRACT abstract 抽象类(自 PHP 5.0.0 起可用)
T_AND_EQUAL &= 赋值运算符
T_ARRAY array() array(),数组语法
T_ARRAY_CAST (array) 类型转换

相关函数

  • token_get_all

把php源代码转换成一个对应的解析代号(数字)的数组

  • token_name

把整型的解析代号转换成其对应的名称

应用举例

ThinkPHP有个用来去除代码中的空白和注释的函数:

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
function strip_whitespace($content) {
$stripStr = '';
//分析php源码
$tokens = token_get_all($content);
$last_space = false;
for ($i = 0, $j = count($tokens); $i < $j; $i++) {
if (is_string($tokens[$i])) {
$last_space = false;
$stripStr .= $tokens[$i];
} else {
switch ($tokens[$i][0]) {
//过滤各种PHP注释
case T_COMMENT:
case T_DOC_COMMENT:
break;
//过滤空格
case T_WHITESPACE:
if (!$last_space) {
$stripStr .= ' ';
$last_space = true;
}
break;
case T_START_HEREDOC:
$stripStr .= "<<<THINKn";
break;
case T_END_HEREDOC:
$stripStr .= "THINK;n";
for($k = $i+1; $k < $j; $k++) {
if(is_string($tokens[$k]) && $tokens[$k] == ';') {
$i = $k;
break;
} else if($tokens[$k][0] == T_CLOSE_TAG) {
break;
}
}
break;
default:
$last_space = false;
$stripStr .= $tokens[$i][1];
}
}
}
return $stripStr;
}
坚持原创技术分享,您的支持将鼓励我继续创作!