Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL,举个例子,比如你写下了如下的PHP代码:
- <?php
- echo "Hello World";
- $a = 1 + 1;
- echo $a;
- ?>
PHP执行这段代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)
- 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
- 2.Parsing, 将Tokens转换成简单而有意义的表达式
- 3.Compilation, 将表达式编译成Opocdes
- 4.Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。
题外话:现在有的Cache比如APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。
那什么是Lexing? 学过编译原理的同学都应该对编译原理中的词法分析步骤有所了解,Lex就是一个词法分析的依据表。 Zend/zend_language_scanner.c会根据Zend/zend_language_scanner.l(Lex文件),来输入的 PHP代码进行词法分析,从而得到一个一个的“词”,PHP4.2开始提供了一个函数叫token_get_all,这个函数就可以讲一段PHP代码 Scanning成Tokens;
如果用这个函数处理我们开头提到的PHP代码,将会得到如下结果:
- Array
- (
- [0] => Array
- (
- [0] => 367
- [1] => Array
- (
- [0] => 316
- [1] => echo
- )
- [2] => Array
- (
- [0] => 370
- [1] =>
- )
- [3] => Array
- (
- [0] => 315
- [1] => "Hello World"
- )
- [4] => ;
- [5] => Array
- (
- [0] => 370
- [1] =>
- )
- [6] => =
- [7] => Array
- (
- [0] => 370
- [1] =>
- )
- [8] => Array
- (
- [0] => 305
- [1] => 1
- )
- [9] => Array
- (
- [0] => 370
- [1] =>
- )
- [10] => +
- [11] => Array
- (
- [0] => 370
- [1] =>
- )
- [12] => Array
- (
- [0] => 305
- [1] => 1
- )
- [13] => ;
- [14] => Array
- (
- [0] => 370
- [1] =>
- )
- [15] => Array
- (
- [0] => 316
- [1] => echo
- )
- [16] => Array
- (
- [0] => 370
- [1] =>
- )
- [17] => ;
- )
分析这个返回结果我们可以发现,源码中的字符串,字符,空格,都会原样返回。每个源代码中的字符,都会出现在相应的顺序处。而,其他的比如标签,操作符,语句,都会被转换成一个包含俩部分的Array: Token ID (也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。
接下来,就是Parsing阶段了,Parsing首先会丢弃Tokens Array中的多于的空格,然后将剩余的Tokens转换成一个一个的简单的表达式
- 1.echo a constant string
- 2.add two numbers together
- 3.store the result of the prior expression to a variable
- 4.echo a variable
然后就改Compilation阶段了,它会把Tokens编译成一个个op_array, 每个op_arrayd包含如下5个部分:
- 1.Opcode数字的标识,指明了每个op_array的操作类型,比如add , echo
- 2.结果 存放Opcode结果
- 3.操作数1 给Opcode的操作数
- 4.操作数2
- 5.扩展值 1个整形用来区别被重载的操作符
比如,我们的PHP代码会被Parsing成:
- * ZEND_ECHO 'Hello World'
- * ZEND_ADD ~0 1 1
- * ZEND_ASSIGN !0 ~0
- * ZEND_ECHO !0
呵呵,你可能会问了,我们的$a去那里了?
恩,这个要介绍操作数了,每个操作数都是由以下俩个部分组成:
- a)op_type : 为IS_CONST, IS_TMP_VAR, IS_VAR, IS_UNUSED, or IS_CV
- b)u,一个联合体,根据op_type的不同,分别用不同的类型保存了这个操作数的值(const)或者左值(var)
而对于var来说,每个var也不一样
IS_TMP_VAR, 顾名思义,这个是一个临时变量,保存一些op_array的结果,以便接下来的op_array使用,这种的操作数的u保存着一个指向变量表的一个句柄(整数),这种操作数一般用~开头,比如~0,表示变量表的0号未知的临时变量
IS_VAR 这种就是我们一般意义上的变量了,他们以$开头表示
IS_CV 表示ZE2.1/PHP5.1以后的编译器使用的一种cache机制,这种变量保存着被它引用的变量的地址,当一个变量第一次被引用的时候,就会被CV起来,以后对这个变量的引用就不需要再次去查找active符号表了,CV变量以!开头表示。
这么看来,我们的$a被优化成!0了。
补充细节的
转载自:https://blog.csdn.net/qq_34095777/article/details/78940789
首先,介绍 token_get_all()
作用: 将提供的源码按PHP标记进行分割,类似与其他字符串分割函数,只是该函数指定了分割模式,你只需要传入字符串就可以。
那么,最重要的就是所谓的PHP标记了。–参见文章的最后
注意:
1.必须是有效的PHP代码字符串才会被分解
2.额外的一个知识点,字符串的四种定界符:
(1) 双引号
(2) 单引号
(3) heredoc, <<<标识符 标识符; 相当于双引号,解析其中的变量
(4) nowdoc, <<<’标识符’ 标识符; 相当于单引号,不解析其中的变量
代码:
<?php
$str=<<<'EOF'
<?php
define('T_NEW_LINE', -1);function token_get_all_nl($source){
$new_tokens = array();
// Get the tokens
$tokens = token_get_all($source);
// Split newlines into their own tokens
foreach ($tokens as $token)
{
$token_name = is_array($token) ? $token[0] : null;
$token_data = is_array($token) ? $token[1] : $token;
// Do not split encapsed strings or multiline comments
if ($token_name == T_CONSTANT_ENCAPSED_STRING || substr($token_data, 0, 2) == '/*')
{
$new_tokens[] = array($token_name, $token_data);
continue;
}
// Split the data up by newlines
$split_data = preg_split('#(\r\n|\n)#', $token_data, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
foreach ($split_data as $data)
{
if ($data == "\r\n" || $data == "\n")
{
// This is a new line token
$new_tokens[] = array(T_NEW_LINE, $data);
}
else
{
// Add the token under the original token name
$new_tokens[] = is_array($token) ? array($token_name, $data) : $data;
}
}
}
return $new_tokens;
}
function token_name_nl($token)
{
if ($token === T_NEW_LINE)
{
return 'T_NEW_LINE';
}
return token_name($token);
}
?>
EOF;
$resArr = token_get_all($str);
print_r($resArr);
结果片段:
Array
(
[0] => Array
(
[0] => 379
[1] => <?php
[2] => 1
)
[1] => Array
(
[0] => 382
[1] =>
[2] => 1
)
[2] => Array
(
[0] => 319
[1] => define
[2] => 2
)
[3] => (
[4] => Array
(
[0] => 323
[1] => 'T_NEW_LINE'
[2] => 2
)
[5] => ,
[6] => Array
(
[0] => 382
[1] =>
[2] => 2
)
[7] => -
[8] => Array
(
[0] => 317
[1] => 1
[2] => 2
)
[9] => )
[10] => ;
[11] => Array
(
[0] => 346
[1] => function
[2] => 2
)
[12] => Array
(
[0] => 382
[1] =>
[2] => 2
)
[13] => Array
(
[0] => 319
[1] => token_get_all_nl
[2] => 2
)
[14] => (
[15] => Array
(
[0] => 320
[1] => $source
[2] => 2
)
[16] => )
[17] => {
[18] => Array
(
[0] => 382
[1] =>
[2] => 2
)
[19] => Array
(
[0] => 320
[1] => $new_tokens
[2] => 3
)
[20] => Array
(
[0] => 382
[1] =>
[2] => 3
)
[21] => =
[22] => Array
(
[0] => 382
[1] =>
[2] => 3
)
[23] => Array
(
[0] => 368
[1] => array
[2] => 3
)
[24] => (
[25] => )
[26] => ;
[27] => Array
(
[0] => 382
[1] =>
[2] => 3
)
[28] => Array
(
[0] => 377
[1] => // Get the tokens
[2] => 5
)
[29] => Array
(
[0] => 382
[1] =>
[2] => 6
)
[30] => Array
(
[0] => 320
[1] => $tokens
[2] => 6
)
[31] => Array
(
[0] => 382
[1] =>
[2] => 6
)
[32] => =
[33] => Array
(
[0] => 382
[1] =>
[2] => 6
)
[34] => Array
(
[0] => 319
[1] => token_get_all
[2] => 6
)
[35] => (
[36] => Array
(
[0] => 320
[1] => $source
[2] => 6
)
[37] => )
[38] => ;
[39] => Array
(
[0] => 382
[1] =>
[2] => 6
)
[40] => Array
(
[0] => 377
[1] => // Split newlines into their own tokens
[2] => 8
)
[41] => Array
(
[0] => 382
[1] =>
[2] => 9
)
[42] => Array
(
[0] => 334
[1] => foreach
[2] => 9
)
[43] => Array
(
[0] => 382
[1] =>
[2] => 9
)
[44] => (
[45] => Array
(
[0] => 320
[1] => $tokens
[2] => 9
)
[46] => Array
(
[0] => 382
[1] =>
[2] => 9
)
[47] => Array
(
[0] => 338
[1] => as
[2] => 9
)
[48] => Array
(
[0] => 382
[1] =>
[2] => 9
)
[49] => Array
(
[0] => 320
[1] => $token
[2] => 9
)
[50] => )
[51] => Array
(
[0] => 382
[1] =>
[2] => 9
)
[52] => {
[53] => Array
(
[0] => 382
[1] =>
[2] => 10
)
[54] => Array
(
[0] => 320
[1] => $token_name
[2] => 11
)
[55] => Array
(
[0] => 382
[1] =>
[2] => 11
)
[56] => =
[57] => Array
(
[0] => 382
[1] =>
[2] => 11
)
[58] => Array
(
[0] => 319
[1] => is_array
[2] => 11
)
[59] => (
[60] => Array
(
[0] => 320
[1] => $token
[2] => 11
)
[61] => )
[62] => Array
(
[0] => 382
[1] =>
[2] => 11
)
[63] => ?
[64] => Array
(
[0] => 382
[1] =>
[2] => 11
)
[65] => Array
(
[0] => 320
[1] => $token
[2] => 11
)
[66] => [
[67] => Array
(
[0] => 317
[1] => 0
[2] => 11
)
[68] => ]
[69] => Array
(
[0] => 382
[1] =>
[2] => 11
)
[70] => :
[71] => Array
(
[0] => 382
[1] =>
[2] => 11
)
[72] => Array
(
[0] => 319
[1] => null
[2] => 11
)
[73] => ;
[74] => Array
(
[0] => 382
[1] =>
[2] => 11
)
[75] => Array
(
[0] => 320
[1] => $token_data
[2] => 12
)
[76] => Array
(
[0] => 382
[1] =>
[2] => 12
)
[77] => =
[78] => Array
(
[0] => 382
[1] =>
[2] => 12
)
[79] => Array
(
[0] => 319
[1] => is_array
[2] => 12
)
[80] => (
[81] => Array
(
[0] => 320
[1] => $token
[2] => 12
)
[82] => )
[83] => Array
(
[0] => 382
[1] =>
[2] => 12
)
[84] => ?
[85] => Array
(
[0] => 382
[1] =>
[2] => 12
)
[86] => Array
(
[0] => 320
[1] => $token
[2] => 12
)
[87] => [
[88] => Array
(
[0] => 317
[1] => 1
[2] => 12
)
[89] => ]
[90] => Array
(
[0] => 382
[1] =>
[2] => 12
)
[91] => :
[92] => Array
(
[0] => 382
[1] =>
[2] => 12
)
[93] => Array
(
[0] => 320
[1] => $token
[2] => 12
)
[94] => ;
[95] => Array
(
[0] => 382
[1] =>
[2] => 12
)
[96] => Array
(
[0] => 377
[1] => // Do not split encapsed strings or multiline comments
[2] => 14
)
[97] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[98] => Array
(
[0] => 327
[1] => if
[2] => 15
)
[99] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[100] => (
[101] => Array
(
[0] => 320
[1] => $token_name
[2] => 15
)
[102] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[103] => Array
(
[0] => 285
[1] => ==
[2] => 15
)
[104] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[105] => Array
(
[0] => 319
[1] => T_CONSTANT_ENCAPSED_STRING
[2] => 15
)
[106] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[107] => Array
(
[0] => 283
[1] => ||
[2] => 15
)
[108] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[109] => Array
(
[0] => 319
[1] => substr
[2] => 15
)
[110] => (
[111] => Array
(
[0] => 320
[1] => $token_data
[2] => 15
)
[112] => ,
[113] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[114] => Array
(
[0] => 317
[1] => 0
[2] => 15
)
[115] => ,
[116] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[117] => Array
(
[0] => 317
[1] => 2
[2] => 15
)
[118] => )
[119] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[120] => Array
(
[0] => 285
[1] => ==
[2] => 15
)
[121] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[122] => Array
(
[0] => 323
[1] => '/*'
[2] => 15
)
[123] => )
[124] => Array
(
[0] => 382
[1] =>
[2] => 15
)
[125] => {
[126] => Array
(
[0] => 382
[1] =>
[2] => 16
)
[127] => Array
(
[0] => 320
[1] => $new_tokens
[2] => 17
)
[128] => [
[129] => ]
[130] => Array
(
[0] => 382
[1] =>
[2] => 17
)
[131] => =
[132] => Array
(
[0] => 382
[1] =>
[2] => 17
)
[133] => Array
(
[0] => 368
[1] => array
[2] => 17
)
[134] => (
[135] => Array
(
[0] => 320
[1] => $token_name
[2] => 17
)
[136] => ,
[137] => Array
(
[0] => 382
[1] =>
[2] => 17
)
[138] => Array
(
[0] => 320
[1] => $token_data
[2] => 17
)
[139] => )
[140] => ;
[141] => Array
(
[0] => 382
[1] =>
[2] => 17
)
[142] => Array
(
[0] => 344
[1] => continue
[2] => 18
)
[143] => ;
[144] => Array
(
[0] => 382
[1] =>
[2] => 18
)
[145] => }
[146] => Array
(
[0] => 382
[1] =>
[2] => 19
)
[147] => Array
(
[0] => 377
[1] => // Split the data up by newlines
[2] => 21
)
[148] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[149] => Array
(
[0] => 320
[1] => $split_data
[2] => 22
)
[150] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[151] => =
[152] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[153] => Array
(
[0] => 319
[1] => preg_split
[2] => 22
)
[154] => (
[155] => Array
(
[0] => 323
[1] => '#(\r\n|\n)#'
[2] => 22
)
[156] => ,
[157] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[158] => Array
(
[0] => 320
[1] => $token_data
[2] => 22
)
[159] => ,
[160] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[161] => -
[162] => Array
(
[0] => 317
[1] => 1
[2] => 22
)
[163] => ,
[164] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[165] => Array
(
[0] => 319
[1] => PREG_SPLIT_DELIM_CAPTURE
[2] => 22
)
[166] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[167] => |
[168] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[169] => Array
(
[0] => 319
[1] => PREG_SPLIT_NO_EMPTY
[2] => 22
)
[170] => )
[171] => ;
[172] => Array
(
[0] => 382
[1] =>
[2] => 22
)
[173] => Array
(
[0] => 334
[1] => foreach
[2] => 24
)
[174] => Array
(
[0] => 382
[1] =>
[2] => 24
)
[175] => (
[176] => Array
(
[0] => 320
[1] => $split_data
[2] => 24
)
[177] => Array
(
[0] => 382
[1] =>
[2] => 24
)
[178] => Array
(
[0] => 338
[1] => as
[2] => 24
)
[179] => Array
(
[0] => 382
[1] =>
[2] => 24
)
[180] => Array
(
[0] => 320
[1] => $data
[2] => 24
)
[181] => )
[182] => Array
(
[0] => 382
[1] =>
[2] => 24
)
[183] => {
[184] => Array
(
[0] => 382
[1] =>
[2] => 25
)
[185] => Array
(
[0] => 327
[1] => if
[2] => 26
)
[186] => Array
(
[0] => 382
[1] =>
[2] => 26
)
[187] => (
[188] => Array
(
[0] => 320
[1] => $data
[2] => 26
)
[189] => Array
(
[0] => 382
[1] =>
[2] => 26
)
[190] => Array
(
[0] => 285
[1] => ==
[2] => 26
)
[191] => Array
(
[0] => 382
[1] =>
[2] => 26
)
[192] => Array
(
[0] => 323
[1] => "\r\n"
[2] => 26
)
[193] => Array
(
[0] => 382
[1] =>
[2] => 26
)
[194] => Array
(
[0] => 283
[1] => ||
[2] => 26
)
[195] => Array
(
[0] => 382
[1] =>
[2] => 26
)
[196] => Array
(
[0] => 320
[1] => $data
[2] => 26
)
[197] => Array
(
[0] => 382
[1] =>
[2] => 26
)
[198] => Array
(
[0] => 285
[1] => ==
[2] => 26
)
[199] => Array
(
[0] => 382
[1] =>
[2] => 26
)
[200] => Array
(
[0] => 323
[1] => "\n"
[2] => 26
)
[201] => )
[202] => Array
(
[0] => 382
[1] =>
[2] => 26
)
[203] => {
[204] => Array
(
[0] => 382
[1] =>
[2] => 27
)
[205] => Array
(
[0] => 377
[1] => // This is a new line token
[2] => 28
)
[206] => Array
(
[0] => 382
[1] =>
[2] => 29
)
[207] => Array
(
[0] => 320
[1] => $new_tokens
[2] => 29
)
[208] => [
[209] => ]
[210] => Array
(
[0] => 382
[1] =>
[2] => 29
)
[211] => =
[212] => Array
(
[0] => 382
[1] =>
[2] => 29
)
[213] => Array
(
[0] => 368
[1] => array
[2] => 29
)
[214] => (
[215] => Array
(
[0] => 319
[1] => T_NEW_LINE
[2] => 29
)
[216] => ,
[217] => Array
(
[0] => 382
[1] =>
[2] => 29
)
[218] => Array
(
[0] => 320
[1] => $data
[2] => 29
)
[219] => )
[220] => ;
[221] => Array
(
[0] => 382
[1] =>
[2] => 29
)
[222] => }
[223] => Array
(
[0] => 382
[1] =>
[2] => 30
)
[224] => Array
(
[0] => 309
[1] => else
[2] => 31
)
[225] => Array
(
[0] => 382
[1] =>
[2] => 31
)
[226] => {
[227] => Array
(
[0] => 382
[1] =>
[2] => 32
)
[228] => Array
(
[0] => 377
[1] => // Add the token under the original token name
[2] => 33
)
[229] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[230] => Array
(
[0] => 320
[1] => $new_tokens
[2] => 34
)
[231] => [
[232] => ]
[233] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[234] => =
[235] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[236] => Array
(
[0] => 319
[1] => is_array
[2] => 34
)
[237] => (
[238] => Array
(
[0] => 320
[1] => $token
[2] => 34
)
[239] => )
[240] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[241] => ?
[242] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[243] => Array
(
[0] => 368
[1] => array
[2] => 34
)
[244] => (
[245] => Array
(
[0] => 320
[1] => $token_name
[2] => 34
)
[246] => ,
[247] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[248] => Array
(
[0] => 320
[1] => $data
[2] => 34
)
[249] => )
[250] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[251] => :
[252] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[253] => Array
(
[0] => 320
[1] => $data
[2] => 34
)
[254] => ;
[255] => Array
(
[0] => 382
[1] =>
[2] => 34
)
[256] => }
[257] => Array
(
[0] => 382
[1] =>
[2] => 35
)
[258] => }
[259] => Array
(
[0] => 382
[1] =>
[2] => 36
)
[260] => }
[261] => Array
(
[0] => 382
[1] =>
[2] => 37
)
[262] => Array
(
[0] => 348
[1] => return
[2] => 39
)
[263] => Array
(
[0] => 382
[1] =>
[2] => 39
)
[264] => Array
(
[0] => 320
[1] => $new_tokens
[2] => 39
)
[265] => ;
[266] => Array
(
[0] => 382
[1] =>
[2] => 39
)
[267] => }
[268] => Array
(
[0] => 382
[1] =>
[2] => 40
)
[269] => Array
(
[0] => 346
[1] => function
[2] => 42
)
[270] => Array
(
[0] => 382
[1] =>
[2] => 42
)
[271] => Array
(
[0] => 319
[1] => token_name_nl
[2] => 42
)
[272] => (
[273] => Array
(
[0] => 320
[1] => $token
[2] => 42
)
[274] => )
[275] => Array
(
[0] => 382
[1] =>
[2] => 42
)
[276] => {
[277] => Array
(
[0] => 382
[1] =>
[2] => 43
)
[278] => Array
(
[0] => 327
[1] => if
[2] => 44
)
[279] => Array
(
[0] => 382
[1] =>
[2] => 44
)
[280] => (
[281] => Array
(
[0] => 320
[1] => $token
[2] => 44
)
[282] => Array
(
[0] => 382
[1] =>
[2] => 44
)
[283] => Array
(
[0] => 287
[1] => ===
[2] => 44
)
[284] => Array
(
[0] => 382
[1] =>
[2] => 44
)
[285] => Array
(
[0] => 319
[1] => T_NEW_LINE
[2] => 44
)
[286] => )
[287] => Array
(
[0] => 382
[1] =>
[2] => 44
)
[288] => {
[289] => Array
(
[0] => 382
[1] =>
[2] => 45
)
[290] => Array
(
[0] => 348
[1] => return
[2] => 46
)
[291] => Array
(
[0] => 382
[1] =>
[2] => 46
)
[292] => Array
(
[0] => 323
[1] => 'T_NEW_LINE'
[2] => 46
)
[293] => ;
[294] => Array
(
[0] => 382
[1] =>
[2] => 46
)
[295] => }
[296] => Array
(
[0] => 382
[1] =>
[2] => 47
)
[297] => Array
(
[0] => 348
[1] => return
[2] => 49
)
[298] => Array
(
[0] => 382
[1] =>
[2] => 49
)
[299] => Array
(
[0] => 319
[1] => token_name
[2] => 49
)
[300] => (
[301] => Array
(
[0] => 320
[1] => $token
[2] => 49
)
[302] => )
[303] => ;
[304] => Array
(
[0] => 382
[1] =>
[2] => 49
)
[305] => }
[306] => Array
(
[0] => 382
[1] =>
[2] => 50
)
[307] => Array
(
[0] => 381
[1] => ?>
[2] => 51
)
)
通过结果可以看到,得到一个二维数组
$resArr[0][0] 数字代号,需要使用token_name转换为下面表格中的代号
比如:
token_name(308); // T_STRING
$resArr[0][1] 分割的片段
代号 语法 参考
T_ABSTRACT abstract 抽象类(自 PHP 5.0.0 起可用)
T_AND_EQUAL &= 赋值运算符
T_ARRAY array() array(),数组语法
T_ARRAY_CAST (array)类型转换
T_AS as foreach
T_BAD_CHARACTER 在 ASCII 32 之前除了 \t (0x09), \n (0x0a) 和 \r (0x0d) 以外的任何字符
T_BOOLEAN_AND && 逻辑运算符
T_BOOLEAN_OR | 逻辑运算符
T_BOOL_CAST (bool) 或 (boolean) 类型转换
T_BREAK break break
T_CASE case switch
T_CATCH catch 异常处理(自 PHP 5.0.0 起可用)
T_CHARACTER
T_CLASS class 类和对象
T_CLONE clone 类和对象。仅用于 PHP 5。
T_CLOSE_TAG ?> 或 %>
T_COMMENT // 或 # 以及 PHP 5 下的 /* */ 注释
T_CONCAT_EQUAL .= 赋值运算符
T_CONST const
T_CONSTANT_ENCAPSED_STRING “foo” 或 ‘bar’字符串语法
T_CONTINUE continue
T_CURLY_OPEN
T_DEC - - 递增/递减运算符
T_DECLARE declare declare
T_DEFAULT default switch
T_DIV_EQUAL /= 赋值运算符
T_DNUMBER 0.12,等等 浮点数
T_DOC_COMMENT /** */ PHPDoc 风格的注释(仅用于 PHP 5)
T_DO do do..while
T_DOLLAR_OPEN_CURLY_BRACES ${ 复杂变量解析语法
T_DOUBLE_ARROW => 数组语法
T_DOUBLE_CAST (real),(double),(float) 类型转换
T_DOUBLE_COLON :: 见下面的 T_PAAMAYIM_NEKUDOTAYIM
T_ECHO echo echo
T_ELSE else else
T_ELSEIF elseif elseif
T_EMPTY empty empty()
T_ENCAPSED_AND_WHITESPACE
T_ENDDECLARE enddeclare declare,替代语法
T_ENDFOR endfor for,替代语法
T_ENDFOREACH endforeach foreach,替代语法
T_ENDIF endif if,替代语法
T_ENDSWITCH endswitch switch,替代语法
T_ENDWHILE endwhile while,替代语法
T_END_HEREDOC heredoc 语法
T_EVAL eval() eval()
T_EXIT exit 或 die exit(), die()
T_EXTENDS extends extends,类和对象
T_FILE __FILE__ 常量
T_FINAL final Final 关键字(自 PHP 5.0.0 起可用)
T_FOR for for
T_FOREACH foreach foreach
T_FUNCTION function 或 cfunction 函数
T_GLOBAL global 变量范围
T_HALT_COMPILER __halt_compiler() __halt_compiler(自 PHP 5.1.0 起可用)
T_IF if if
T_IMPLEMENTS implements 对象接口(自 PHP 5.0.0 起可用)
T_INC ++ 递增/递减运算符
T_INCLUDE include() include
T_INCLUDE_ONCE include_once() include_once
T_INLINE_HTML
T_INSTANCEOF instanceof type operators(仅 PHP5)
T_INT_CAST (int) 或 (integer) 类型转换
T_INTERFACE interface 对象接口(自 PHP 5.0.0 起可用)
T_ISSET isset() isset()
T_IS_EQUAL == 比较运算符
T_IS_GREATER_OR_EQUAL >= 比较运算符
T_IS_IDENTICAL === 比较运算符
T_IS_NOT_EQUAL != or <> 比较运算符
T_IS_NOT_IDENTICAL !== 比较运算符
T_IS_SMALLER_OR_EQUAL <= 比较运算符
T_LINE __LINE__ 常量
T_LIST list() list()
T_LNUMBER 123,012,0x1ac,等等 整型
T_LOGICAL_AND and 逻辑运算符
T_LOGICAL_OR or 逻辑运算符
T_LOGICAL_XOR xor 逻辑运算符
T_MINUS_EQUAL -= 赋值运算符
T_ML_COMMENT /* 和 */ 注释(仅用于 PHP 4)
T_MOD_EQUAL %= 赋值运算符
T_MUL_EQUAL *= 赋值运算符
T_NEW new 类和对象
T_NUM_STRING
T_OBJECT_CAST (object) 类型转换
T_OBJECT_OPERATOR -> 类和对象
T_OPEN_TAG <?php, <? 或 <% 从 HTML 转义
T_OPEN_TAG_WITH_ECHO <?= or <%= 从 HTML 转义
T_OR_EQUAL = 赋值运算符
T_PAAMAYIM_NEKUDOTAYIM :: ::也定义为 T_DOUBLE_COLON。
T_PLUS_EQUAL += 赋值运算符
T_PRINT print() print
T_PRIVATE private 类和对象。仅用于 PHP 5。
T_PUBLIC public 类和对象。仅用于 PHP 5。
T_PROTECTED protected 类和对象。仅用于 PHP 5。
T_REQUIRE require() require
T_REQUIRE_ONCE require_once() require_once
T_RETURN return 返回值
T_SL << 位运算符
T_SL_EQUAL <<= 赋值运算符
T_SR >> 位运算符
T_SR_EQUAL >>= 赋值运算符
T_START_HEREDOC <<< heredoc 语法
T_STATIC static 变量范围
T_STRING
T_STRING_CAST (string) 类型转换
T_STRING_VARNAME
T_SWITCH switch switch
T_THROW throw 异常处理(自 PHP 5.0.0 起可用)
T_TRY try 异常处理(自 PHP 5.0.0 起可用)
T_UNSET unset() unset()
T_UNSET_CAST (unset) (无文档; 类型为 NULL)
T_USE use (未实现)
T_VAR var 类和对象
T_VARIABLE $foo 变量
T_WHILE while while,do..while
T_WHITESPACE
T_XOR_EQUAL ^= 赋值运算符
T_FUNC_C __FUNCTION__ 常量,自 PHP 4.3.0 起可用
T_CLASS_C __CLASS__ 常量,自 PHP 4.3.0 起可用