深入理解PHP原理之Opcodes


Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL,举个例子,比如你写下了如下的PHP代码:

  1.  <?php
  2.    echo "Hello World";
  3.    $a = 1 + 1;
  4.    echo $a;
  5. ?>

PHP执行这段代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)  

  1. 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
  2. 2.Parsing, 将Tokens转换成简单而有意义的表达式
  3. 3.Compilation, 将表达式编译成Opocdes
  4. 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代码,将会得到如下结果:

 
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.            [0] => 367
  6.            [1] => Array
  7.         (
  8.             [0] => 316
  9.             [1] => echo
  10.         )
  11.     [2] => Array
  12.         (
  13.             [0] => 370
  14.             [1] =>
  15.         )
  16.     [3] => Array
  17.         (
  18.             [0] => 315
  19.             [1] => "Hello World"
  20.         )
  21.     [4] => ;
  22.     [5] => Array
  23.         (
  24.             [0] => 370
  25.             [1] =>
  26.         )
  27.     [6] => =
  28.     [7] => Array
  29.         (
  30.             [0] => 370
  31.             [1] =>
  32.         )
  33.     [8] => Array
  34.         (
  35.             [0] => 305
  36.             [1] => 1
  37.         )
  38.     [9] => Array
  39.         (
  40.             [0] => 370
  41.             [1] =>
  42.         )
  43.     [10] => +
  44.     [11] => Array
  45.         (
  46.             [0] => 370
  47.             [1] =>
  48.         )
  49.     [12] => Array
  50.         (
  51.             [0] => 305
  52.             [1] => 1
  53.         )
  54.     [13] => ;
  55.     [14] => Array
  56.         (
  57.             [0] => 370
  58.             [1] =>
  59.         )
  60.     [15] => Array
  61.         (
  62.             [0] => 316
  63.             [1] => echo
  64.         )
  65.     [16] => Array
  66.         (
  67.             [0] => 370
  68.             [1] =>
  69.         )
  70.     [17] => ;
  71. )

分析这个返回结果我们可以发现,源码中的字符串,字符,空格,都会原样返回。每个源代码中的字符,都会出现在相应的顺序处。而,其他的比如标签,操作符,语句,都会被转换成一个包含俩部分的Array: Token ID (也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。
接下来,就是Parsing阶段了,Parsing首先会丢弃Tokens Array中的多于的空格,然后将剩余的Tokens转换成一个一个的简单的表达式

 
  1. 1.echo a constant string
  2. 2.add two numbers together
  3. 3.store the result of the prior expression to a variable
  4. 4.echo a variable

然后就改Compilation阶段了,它会把Tokens编译成一个个op_array, 每个op_arrayd包含如下5个部分:

  1. 1.Opcode数字的标识,指明了每个op_array的操作类型,比如add , echo
  2. 2.结果 存放Opcode结果
  3. 3.操作数1 给Opcode的操作数
  4. 4.操作数2
  5. 5.扩展值 1个整形用来区别被重载的操作符

比如,我们的PHP代码会被Parsing成:  

  1. * ZEND_ECHO 'Hello World'
  2. * ZEND_ADD ~0 1 1
  3. * ZEND_ASSIGN !0 ~0
  4. * ZEND_ECHO !0

呵呵,你可能会问了,我们的$a去那里了?
恩,这个要介绍操作数了,每个操作数都是由以下俩个部分组成:  

  1. a)op_type : 为IS_CONST, IS_TMP_VAR, IS_VAR, IS_UNUSED, or IS_CV
  2. 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 起可用
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值