介紹php中的token_get_all函數
對于一名php開發者來說,一定不會陌生php中的token_get_all函數。這個函數可以將php代碼拆分成一個個的php詞法單元(token),并返回它們的數組。那么這些詞法單元有什么用呢?下面我們就具體分析。
php詞法單元的含義
在php中,我們使用編譯器將我們的php代碼編譯成二進制代碼。在這個編譯過程中,php代碼會被切割成一個個的php詞法單元。例如下面這段php代碼:
會被切割成下列tokens:
從上面的結果可以看出,一個php詞法單元是由一個數組來表示的。這個數組的第一項是一個代表該詞法單元類型的常量,比如T_ECHO、T_CONSTANT_ENCAPSED_STRING等等。第二項則是該詞法單元的實際內容,可以是一個數字、字符串或者變量名等等。
應用場景舉例
詞法單元在編寫一些php擴展時特別有用,直接操作php代碼是不夠安全和高效的。如果需要在php代碼中嵌入一些C代碼,直接將C代碼嵌入其中在編譯時會有大量的限制,為了避免這些限制,我們需要將C代碼嵌入php的語法中,一種方式就是使用php詞法單元。
例如下面這段php代碼:
可以使用php詞法單元來解析上述代碼并修改其中的echo語句:
運行以上代碼,輸出結果為:
可以看到,我們使用了php詞法單元將原來的echo語句修改成了print函數。
結語
總結一下,php詞法單元在很多場合下都是非常有用的,尤其在一些擴展的開發中。掌握這個函數的使用方法十分重要,建議大家多多嘗試。
對于一名php開發者來說,一定不會陌生php中的token_get_all函數。這個函數可以將php代碼拆分成一個個的php詞法單元(token),并返回它們的數組。那么這些詞法單元有什么用呢?下面我們就具體分析。
php詞法單元的含義
在php中,我們使用編譯器將我們的php代碼編譯成二進制代碼。在這個編譯過程中,php代碼會被切割成一個個的php詞法單元。例如下面這段php代碼:
echo "hello, world!";
會被切割成下列tokens:
array( [0] => array( [0] => T_ECHO [1] => echo ) [1] => ' ' [2] => array( [0] => T_CONSTANT_ENCAPSED_STRING [1] => "hello, world!" ) [3] => ';' )
從上面的結果可以看出,一個php詞法單元是由一個數組來表示的。這個數組的第一項是一個代表該詞法單元類型的常量,比如T_ECHO、T_CONSTANT_ENCAPSED_STRING等等。第二項則是該詞法單元的實際內容,可以是一個數字、字符串或者變量名等等。
應用場景舉例
詞法單元在編寫一些php擴展時特別有用,直接操作php代碼是不夠安全和高效的。如果需要在php代碼中嵌入一些C代碼,直接將C代碼嵌入其中在編譯時會有大量的限制,為了避免這些限制,我們需要將C代碼嵌入php的語法中,一種方式就是使用php詞法單元。
例如下面這段php代碼:
function print_sum($a, $b) { $sum = $a + $b; echo $sum; } print_sum(1, 2);
可以使用php詞法單元來解析上述代碼并修改其中的echo語句:
$tokens = token_get_all(file_get_contents('test.php')); $changed_code = ''; $echo_changed = false; foreach ($tokens as $token) { if (is_array($token)) { if ($token[0] == T_ECHO) { $changed_code .= 'print('; $echo_changed = true; } else { $changed_code .= $token[1]; } } else { if ($echo_changed && $token == ';') { $changed_code .= ')'; $echo_changed = false; } else { $changed_code .= $token; } } } print($changed_code);
運行以上代碼,輸出結果為:
function print_sum($a, $b) { $sum = $a + $b; print($sum); } print_sum(1, 2);
可以看到,我們使用了php詞法單元將原來的echo語句修改成了print函數。
結語
總結一下,php詞法單元在很多場合下都是非常有用的,尤其在一些擴展的開發中。掌握這個函數的使用方法十分重要,建議大家多多嘗試。
上一篇vue能寫靜態網站嗎
下一篇ajax循環數據如何交互