歡迎來到小豬圈!

2008-11-06

用 token_get_all 分析 PHP 原始碼

  • token_get_all() 將原始碼拆成陣列,每個陣列元素可能是字串或陣列,字串的話包括像等於、分號或大小括弧等,陣列的話則依序包括 token index 、內容跟所在行數。這裡的 token index 是整數,可以用 token_name() 轉成相對應的名字。
  • 以下是簡單的範例,將每個元素用 <span> 包起來,並設定 class 為 token name :
    <?php
    $source 
    file_get_contents(__FILE__);
    $ary token_get_all($source);
    foreach (
    $ary as $key => $value) {
      if (
    is_array($value)){
        echo 
    '<span class="' token_name($value[0]) . '">' htmlspecialchars($value[1]) . '</span>';
      } else {
        echo 
    '<span>' htmlspecialchars($value) . '</span>';
      }
    }
    ?>
  • 用 get_defined_constants 取得所有可用的 token (參見 PHP: List of Parser Tokens - Manual):
    <?php
    $constants 
    get_defined_constants(true);
    var_dump($constants['tokenizer']);
    ?>
  • 首先要注意的是, token_get_all 對原始碼分析的結果跟本機環境設定有關:
    1. 像 <?= 在 short_open_tag = On 的時候是 T_OPEN_TAG_WITH_ECHO ,反之則是 T_INLINE_HTML 。
    2. 我用的 PHP 5.2.6 就沒有 T_DIR 、 T_NS_C 這些 5.3 版才定義的 token 。
  • 另外要注意的是,到了 CSS 2.1 才定義可以使用底線 (_; underscore) 做為 class name selector ,參見 CSS2 syntax and basic data typesGrammar of CSS 2.1,如果要將 token name 做為 CSS class selector 的話,最好將底線換為連字號 (-; hyphen)

No comments:

Post a Comment

Comment Form Message

標籤分類

Blog Archive

Labels

Google Analytics Tracking Code

About Me

My photo
Keelung, R.O.C, Taiwan
一個不學無術、混吃等死的傢伙…