歡迎來到小豬圈!

Showing posts with label PHP. Show all posts
Showing posts with label PHP. Show all posts

2012-07-06

SQLite 預設時區為GMT

  • 若將 SQLite 資料庫裡的時間欄位,設為自動填入目前的時間(如下例),則預設時區一律是 GMT(+00:00) ,而非 php.ini 所設定的時區。
  • CREATE TABLE table_name
    (
      col_name DATETIME DEFAULT CURRENT_TIMESTAMP
    );
    
  • 解決方案之一是從 PHP 裡轉換:
  • <?php
    $get_datetime_form_sqlite = '2009-03-21 13:14';
    
    $myDateTime = new DateTime($get_datetime_form_sqlite, new DateTimeZone('GMT'));
    echo $myDateTime->format(DateTime::ISO8601);
    //output: 2009-03-21T13:14:00+0000
    
    $myDateTime->setTimezone(new DateTimeZone('Asia/Taipei'));
    echo $myDateTime->format(DateTime::ISO8601);
    //output: 2009-03-21T21:14:00+0800
    
  • 另外就是做 SQL 查詢時轉換:
  • SELECT datetime(col_name, 'localtime') FROM table_name;
    

2011-04-16

PHP 在 Windows 下的 Unicode 檔名問題

  • 簡而言之…無解! (爆)
  • 要等到PHP6原生支援Unicode才行。

2009-08-11

Array 、 ArrayAccess 與 ArrayObject

  • PHP5 有提供 ArrayAccess Interface 讓自製的 Classes/Objects 也有如陣列 (Array) 型別用 [] 取存方式。 SPL 也有實作 ArrayObject 。
  • 但有一個關鍵的差異是新增陣列項目,一般陣列在無鍵值時是新增一個鍵值為最大整數的項目,鍵值為 null 時則新增一個鍵值為空字串的項目,自製物件是分不出兩者的差異的(無鍵值與 null 都視為 null)。請看下面範例:
    
    <?php
    class ArrayAccessObject implements ArrayAccess{
      private $position = 0;
      private $_array = array();
    
      /* impements ArrayAccess */
      public function offsetSet($offset, $value) {
        var_dump($offset);
        $this->_array[$offset] = $value;
      }
      public function offsetExists($offset) {
        return isset($this->_array[$offset]);
      }
      public function offsetUnset($offset) {
        unset($this->_array[$offset]);
      }
      public function offsetGet($offset) {
        return isset($this->_array[$offset]) ? $this->_array[$offset] : null;
      }
    }
    
    $a = array();
    $b = new ArrayObject();
    $c = new ArrayAccessObject();
    
    $a[] = 'nothing';
    $b[] = 'nothing';
    $c[] = 'nothing';
    
    $a[null] = 'null';
    $b[null] = 'null';
    $c[null] = 'null';
    
    
    var_dump($a);
    var_dump($b);
    var_dump($c);
    
    /* output */
    
    NULL
    NULL
    array(2) {
      [0]=>
      string(7) "nothing"
      [""]=>
      string(4) "null"
    }
    object(ArrayObject)#1 (1) {
      ["storage":"ArrayObject":private]=>
      array(2) {
        [0]=>
        string(7) "nothing"
        [1]=>
        string(4) "null"
      }
    }
    object(ArrayAccessObject)#2 (2) {
      ["position":"ArrayAccessObject":private]=>
      int(0)
      ["_array":"ArrayAccessObject":private]=>
      array(1) {
        [""]=>
        string(4) "null"
      }
    }
    
    
    

2009-08-03

base_convert 的限制

  • 剛稍微測試 PHP 函數 base_convert() ,數字約大於 2^54 以上轉換就會出現錯誤。
  • 2009-08-06 更新:數字超過十進位的 9,007,199,254,740,992 即 2^53 以上,轉換就會出現錯誤。
  • 2009-08-09 更新:MySQL 有提供相同功能的函數 CONV(),文件指出最大值為 2^64 (十進位的 18,446,744,073,709,551,615,輸入大於這個值都會傳回相同於這個值的結果),目前測試轉換沒有問題。另外有一點差異是輸出結果為英文大寫字母。

2009-07-26

在 Windows 下編譯 Sphinx PHP 擴充模組

  • 從 PECL :: Package :: sphinx 下載的原始碼,還無法直接編譯,從 config.w32 看來還需要 libsphinxclient.lib 和 sphinxclient.h。
  • 雖然從 Sphinx 中 (在原始碼的 api\libsphinxclient 目錄裡) 自行編譯了 libsphinxclient.lib ,但還是派不上用場。
  • 後來是修改了 config.w32 ,把這行:
    EXTENSION("sphinx", "sphinx.c");
    改寫成
    EXTENSION("sphinx", "sphinx.c sphinxclient.c");
    加在一起編譯才成功的。
  • Sphinx PHP Extension 似乎沒辨法編成獨立的 DLL 檔。將上述那行加上第三個參數為 true 就行了:
    EXTENSION("sphinx", "sphinx.c sphinxclient.c", true);
  • Sphinx 原始碼也有提供 PHP 腳本版本的 API (api/sphinxapi.php) ,直接 include 即可。

2009-07-24

在 Windows 上自行編譯 PHP

  • 自行編譯 PHP 比想像中簡單多了,PHP wiki 已經整理的很完善。文末的編譯步驟是從 PHP 文件 (PHP: Building from source - Manual) 提供簡易指南中,依我個人情況修改而來。
  • 比較麻煩的地方是要收集 Library 與 Header 檔,像 Apache httpd 得選自訂安裝才有附那些檔案。「PHP: internals:windows:libs [PHP Wiki]」這裡整理了大部份的檔案。
  • 我初次編譯使用的是 Windows SDK for Windows Server 2008 and .NET Framework 3.5 ,在執行 nmake 時出現下列錯誤訊息
    "" -h win32\ -r ..\Release_TS\ -x ..\Release_TS\ win32\build\wsyslog.mc
    '-h' is not recognized as an internal or external command,
    operable program or batch file.
    查看 Makefile 發現是少了 MC - Message Compiler (MC.exe) 這個東東,“mc.exe is missing in the Visual Studio 2008 Express SDK | Microsoft Connect”這篇指出似乎是該版本的 Windows SDK 沒附的關係。
  • browscap.c 出現幾個 § (section sign) 符號造成編譯中斷,用 Firefox 瀏覽後轉存即可(我遇到?字元的問題都是這樣解決的)。

  1. 下載並安裝 VC ,Microsoft Visual C++ 2008 Express Edition
  2. 下載並安裝 Windows SDK ,Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1: RC
  3. 複製 C:\Program Files\Microsoft SDKs\Windows\v7.0\Include\WinResrc.h 並更名為 winres.h 到同一目錄下。舊的文件有這條項目,似乎是用來解決某些問題,但我並沒有遇到就是了。
  4. 建立一個工作目錄,這裡以 C:\php-sdk 為例。
  5. 下載 PHP 原始碼並解壓縮至 C:\php-sdk ,這裡以 php-5.3.0 為例。
  6. 下載 http://pecl2.php.net/downloads/php-windows-builds/php-libs/binary-tools.zip 並解壓縮至 C:\php-sdk 。
  7. 依預設的搜尋路徑 (參見原始碼中 php-5.3.0\win32\build\config.w32 第 227 行,也可以自訂 --with-php-build=..\deps) 建立一個存放相關檔案的目錄 C:\php-sdk\deps 。並至 http://wiki.php.net/internals/windows/libs 下載所需檔案解壓至該目錄。
  8. 從開始功能表裡執行 Windows SDK - CMD Shell ,並輸入下列指令。
  9. SetEnv.cmd /x86 /xp /release 設定編譯模式。
  10. SET PATH=%PATH%;C:\php-sdk\bin;
  11. cd \php-sdk\php-5.3.0 (接下來的指令必須在 PHP 原始碼的根目錄下執行)
  12. cscript.exe /nologo win32\build\buildconf.js
  13. cscript.exe /nologo configure.js --help (非必要,查看可用參數)
  14. cscript.exe /nologo configure.js --enable-object-out-dir=.. --disable-all (這裡參數依需求而有所不同)。
  15. nmake (開始編譯,需要一段時間)。
  16. 最終的目錄結構會類似下列這樣:
    +-C:\php-sdk
    | +-bin
    | | --bison.exe
    | | --bison.simple
    | | --...
    | +-deps
    | | +-bin
    | | +-include
    | |   --httpd.h (來自 Apache httpd)
    | |   --...
    | | +-lib
    | |   --libiconv.lib (來自 GNU libiconv)
    | |   --libxml2.lib
    | |   --...
    | +-php-5.3.0 (PHP 原始碼)
    | | +-build
    | | +-win32
    | | +-...
    | +-Release_TS (輸出編譯結果的目錄)
    | | +-...
    
  17. nmake install (安裝編譯的結果,預設安裝至 C:\php5)。

2009-05-13

在 Windows Apache 上同時執行 PHP4 與 PHP5

  • 將 PHP4 與 PHP5 分別以 CGI 和 Apache module 模式執行,以副檔名 .php4 與 .php 分辨執行的版本。
  • 在 httpd.conf 加入
    <Directory "C:/php4">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    </Directory>
    
    # PHP 4
    #"C:/php4/" 這裡尾端必須要加上斜線
    ScriptAlias /php/ "C:/php4/"
    AddHandler php4-script .php4
    Action php4-script "/php/php.exe"
    
    
    # PHP 5
    LoadModule php5_module "C:/php5/php5apache2_2.dll"
    AddType application/x-httpd-php .php
    PHPIniDir "C:/php5"

2009-04-29

在 Google App Engine 上執行 PHP

  • 執行 PHP 是我申請 Google App Engine 的主要目的,利用 Quercus 執行簡單腳本是沒有問題。但麻煩的是 Datastore 的部份,不但沒辨法用 PDO 存取,而且 Datastore 也跟關聯式資料庫差很多,存取資料庫的部份基本上得要重寫。
  • 另一個麻煩是,我在 Java 5 發行之前就沒有再接觸 Java 了,熊熊看不懂 JDO Annotations 跟 JPA 這些 Java 5 以後的新功能(囧),不過還算是小事就是了。
  1. Caucho Technology » Blog Archive » Quercus on the Google App Engine
  2. Annotations (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
  3. Introduction to the Java Persistence API - The Java EE 5 Tutorial

2009-04-28

申請到了 Google App Engine 試用

  • 日前在看到 Google App Engine 支援 Java 的消息同時,才知道這世界上有人實作 PHP in JAVA,一個叫 Quercus 的東西。雖然是個詭異的產品,不過這種情況(GAE不支援PHP)還真的派的上用場。
  • 雖然我申請時沒辨法收到 Google 的認證簡訊 (SMS),不過再回報後兩天還是成功啟用。
  1. Scribe's N.E.W. Studio://Blogger: Google App Engine supports Java
  2. Caucho Resin : Reliable, Open-Source Application Server
  3. http://appengine.google.com/waitlist/sms_issues

2009-04-25

用字串索引存取陣列要加上引號

  • 陣列的索引是字串型態的話,一定要加上引號,雖然不加引號也可以執行,但 PHP 會先嘗試以常數去解譯,所以可能產生預料外的結果。而如果沒有對應到的常數,再嘗試以字串解譯,並同時會輸出 E_NOTICE 影嚮效能。
  • 整數的索引也可以用字串(加引號)的方式取存,但用整數存取速度比較快。
  • 在建立陣列或其項目時,索引是十進位的數字的話會自動轉成整數。
  • 
    <?php
    define('string_index', 'unexpected');
    
    $a = array(
      'string_index' => 'string_index',
      'unexpected' => 'unexpected');
    $b = array(
      '-1'  => 0,
      '1'   => 1,
      '02'  => 2,
      '0x3' => 3
    );
    
    
    echo $a['string_index']; // output: string_index
    echo $a[string_index];   // output: unexpected
    
    var_dump($b);
    /* output
    array (
      -1 => int 0
      1 => int 1
      '02' => int 2
      '0x3' => int 3
      )
    */
    ?>
    
    
  1. PHP: Arrays - Manual。
  2. 数组非数字键名引号的必要性 | 风雪之隅。

2009-04-22

將字串分割為字元陣列

  • PHP 支援用陣列的方式存取字串的字元 $string[1] ,但不能直接將字串用在迴圈上。
  • 上述方式與 str_split() 會有中文斷字的問題,preg_split() 沒有加 u (utf-8 mode)修飾字符也會有一樣問題。
  • 這種情況下 mb_split 派不上用場,雖然支援 regular expression 但不能用空的 pattern (不用 start/end delimiter)。
  • 兩個解決方案之一是用 mb_* 自已寫函式處理,另一個就是用 preg_split() 加上 u 修飾字符,見範例:
    
    <?php
    function string_to_array ($string) {
      $array = array();
      $strlen = mb_strlen($string);
      for ($i=0; $i<$strlen; $i++) {
        $array[] = mb_substr($string, $i, 1, 'UTF-8');
      }
      return $array;
    }
    
    $string = '中文字測試';
    
    str_split($string);
    
    preg_split("//", $string);
    
    mb_split("", $string); // Warning: mb_split(): Empty regular expression
    
    preg_split("//u", $string); //This modifier is available from PHP 4.1.0/Unix and from PHP 4.2.3/win32
    
    var_dump(string_to_array($string));
    ?>
    
    

寫 PHP 要注意的事項 效能篇

  • 用 isset 取代 strlen 檢查字串最小長度,見 PHP: Strings - Manual 中 String access and modification by character 一節。
    
    <?php
    $string = 'aaabbb';
    $string2 = 'aaabbbcccddd';
    var_dump((strlen($string) > 9) ?true:false);//false
    var_dump((strlen($string2) > 9)?true:false);//true
    var_dump((isset($string[9]))   ?true:false);//false
    var_dump((isset($string2[9]))  ?true:false);//true
    ?>
    
    
  • 字串用單引號 (') 標示比雙引號 (") 快,但在嵌入超過一、二個變數以上時,情況就相反了。
    
    <?php
    $string = '中文字測試';
    $string = '中文字' . $string . '測試';
    
    $string = "中文字測試";
    $string = "中文字{$string}測試";
    ?>
    
    
  • 在相同結果的情況下,儘量使用字串類函式取代 Regular Expressions 函式
  • 在存取整個檔案時 file_get_contents/file_put_contents 比自已用 fopen 快,remote 的情況似乎相反。
  • is_file 比 file_exists 快四、五倍,不過似乎要注意在大量執行緒下的情況。
  • 用 ++$i 比 $i++ 快,但我測試的結果差距非常小。
  • 優先使用內建常數,再找內建函式,再來才考慮自行運算
    • 用 PHP_VERSION 取代 phpversion(),而用 version_compare() 比較版本。
    • 用 M_PI 取代 pi() ,以及其它 M_* 開頭預先計算好的值。
    • DATE_ATOM 及其它 DATE_* 常數。
  • 陣列的索引是字串型態的話,一定要加上引號,雖然不加引號也可以執行,但會產生 E_NOTICE 影嚮效能。整數的索引也可以用字串(加引號)的方式取存,但用整數比較快,參見:用字串索引存取陣列要加上引號。
  • 類別建構式(Class constructor)使用 PHP4 版,跟類別同名的函式,比用 PHP5 版 __construct 快約兩倍,這是我在測試版本相容性時發現的,原因不明。
  1. 榨乾 PHP,不得不轉的一篇PHP使用技巧! - 應用討論區 - PHPChina | 中國開源之路 PHPChina|php論壇|Zend中國 - Powered by Discuz!

2009-04-21

查注音函式

  • 利用 xcin 的表格做查詢注音符號的依據。
    
    <?php
    function findZhuyins($word, $cinTable = 'bopomofo.cin') {
      static $data = null;
      static $keyMap = null;
      $result = array();
      if (!$data) {
        $data = file_get_contents($cinTable);
        $pattern = "/%keyname\s+begin\s+(.+?)\s+%keyname\s+end/uis"; //找出按鍵對應字根的區段
        preg_match($pattern, $data, $matches);
        $pattern = "/(.)\s+(.)\s+/ui";
        preg_match_all($pattern, $matches[1], $matches );
        $keyMap = $matches;
      }
      $pattern = "/\n(.+)\s+{$word}/ui";
      preg_match_all($pattern, $data, $matches );
      foreach ($matches[1] as $key => $value) {
        $ary = str_split($value);
        $result[$key] = '';
        foreach ($ary as $value2) {
          $idx = array_search($value2, $keyMap[1]);
          $result[$key] .= $keyMap[2][$idx];
        }
      }
      return $result;
    }
    var_dump( findZhuyins("得"));
    ?>
    
    
  • 注音符號的 cin 表格可以到 OXIM 專案的 FTP(ftp://ftp.opendesktop.org.tw/odp/others/OXIM/cin_tables/)下載,cin 表格清單。
  • 中文轉注音(PHP)

2009-04-18

寫 PHP 要注意的事項

程式可攜性

  • 使用內建常數 DIRECTORY_SEPARATOR
    
    <?php
    include dirname(__FILE__) . DIRECTORY_SEPARATOR . 'some.php';
    ?>
    
    
    大部份情況下直接使用 / 就可以了,除了在展開由系統取得的路徑時,如:
    
    <?php
    var_dump( explode(DIRECTORY_SEPARATOR, getcwd()) );
    ?>
    
    
  • 使用內建常數 PATH_SEPARATOR
    
    <?php
    $path = '/usr/lib/pear';
    set_include_path(get_include_path() . PATH_SEPARATOR . $path);
    ?>
    
    
  • 使用下列兩種 PHP 標籤 (PHP: Escaping from HTML - Manual):
    
    <?php echo phpversion(); ?>
    
    <script language="php"> echo phpversion(); </script>
    
    
    不要用簡短及 ASP 風格的 PHP 標籤:
    <? echo phpversion(); ?>
    
    <?= phpversion(); ?>
    
    <% echo phpversion(); %>
    
    <%= phpversion(); %>
    
    
  • 以零開頭的整數進位制,見 PHP: Integers - Manual:
    
    <?php
    $a = 1234; // decimal number
    $a = -123; // a negative number
    $a = 0123; // octal number (equivalent to 83 decimal)
    $a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
    ?>
    
    
  • 在迴圈中使用參照 (reference) 要注意離開迴圈後參照還是有效。
    
    <?php
    $array = array( 'aaa', 'bbb', 'ccc');
    foreach($array as &$value) {
      $value = $value . 'ddd';
    }
    $value = 'test';
    var_dump($array); // $array[2] = 'test'
    
    
    $array2 = array( 'aaa', 'bbb', 'ccc');
    foreach($array2 as $key => $item) {
      $array2[$key] = $item . 'ddd';
    }
    $item = 'test';
    var_dump($array2);
    ?>
    
    

2009-03-31

自製的 PHP 模版引擎:Classifield

  • Classifield 的主要特色是將模板語法嵌入 HTML 元素的 class 屬性裡。
  • 絕大部份的 HTML 元素都有 class 屬性,而且可以輸入複數的值,不會影嚮既有的 CSS class selector 。
  • 沒有 class 屬性的 HTML 元素有:html 、 head 、 title 、 meta 、 link 、 param script 、 style。
  • Classifield 的原始碼可以到 Google Code (http://code.google.com/p/classifield/)下載。
  • Classifield 使用(接近)純碎 HTML 的模板,幾項特色或優缺點:
    • 模板可以直接用瀏覽器預覽,以及可以被驗証 (參見:The W3C Markup Validation Service)。
    • 分離模板邏輯與模板語法,將程式與美工人員的分工更為明確。
    • 模板不需要插入 PHP 程式碼、模板專用的語法或其它 HTML 以外的語法,對負責模板設計美工的而言,較為友善。
    • 模板能被任何一般文字網頁編輯器,或所見即所得的網頁編輯器正確的開啟。
    • 承上,模板能在所見即所得的網頁編輯器裡編寫模板的語法。以 PHP (本身也是模板引擎) 插入變數到元素的屬性值裡為例:
      <div <?php echo $var1?>="<?=$var2?>"></div>
      部份編輯器會限制或自動編碼元素屬性欄位。
    • 模板語法可以結合網頁結構,下為 Smarty 與 Classifield 的差別:
      <ul>
      {foreach from=$myArray item=foo}
          <li>{$foo}</li>
      {/foreach}
      </ul>
      <ul class="php-foreach-myArray-as-foo">
        <li class="php-echo-foo"></li>
      </ul>
    • 使用即有的技術,減少學習門檻。
    • 需要 DOM lib 剖析模板,降低執行時的效能與提高記憶體需求。
    • 需要其它選擇元素的方式,如QueryTemplates使用的 CSS selector (by phpQuery)
  • 關於分離模板邏輯與模板語法,此點可參考另一個模板引擎 QueryTemplates,該模板引擎做的比較徹底。以及該作者的文章(Pure HTML templates theory « Personal devlog)。

2008-12-22

DOTNET 無法載入其它 .Net Framework assembly

  • 以下測試環境為 PHP 5.2.8 、 Windows XP SP3 、 .NET Framework 2.0 + SDK
  • PHP: DOTNET - Manual 裡的範例(載入 mscorlib)可以執行,但載入其它 assembly (我目前只有試 System.Windows.Forms )就會出現 Failed to instantiate .Net object [CreateInstance] [0x80131513] 的錯誤訊息。這問題(PHP Bugs: #33188: Cannot instantiate a DOTNET object)似乎已經好幾年了。(囧)
  • PHP: DOTNET - Manual 文末指出加上完整的 Assembly name 方法,經測試依然失敗。
  • Assembly 的資訊像是 PublicKeyToken 之類的,在 %WINDIR%\assembly 目錄裡看的到。
  • Bugs: #33188 裡的一篇回覆說可用 GAC 繞過這問題,我測試的結果也是失敗的。
  • gacutil.exe 要安裝 .NET Framework SDK 才有,該程式位置在 %PROGRAMFILES%\Microsoft.NET\SDK\v2.0\Bin\gacutil.exe 。

WebPageGrabber 網頁快照程式

2008-11-07

關於 nl2br

  • 各系統使用不同的換行字元,常見的就是 LF 、 CR 、 CRLF ,詳見 Newline - Wikipedia, the free encyclopedia,此不贅述。
  • 而 PHP 裡有 nl2br() (New Line to BReak) 這個函式,將字串裡的換行字元轉成 HTML <br> ,PHP 4.0.5 以上是換成 XHTML 相容的 <br />。
  • nl2br() 的行為並不是把換行字元取代成<br /> ,而是在換行字元前插入<br /> 。
  • nl2br("\r\r\n\n") 的結果是 <br />\r<br />\r\n<br />\n
  • nl2br() 會先再找 \r\n 和 \n\r (!) 再找 \r 和 \n 。
  • nl2br("\n\r\n") 的結果是 <br />\n\r<br />\n

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 types 與 Grammar of CSS 2.1,如果要將 token name 做為 CSS class selector 的話,最好將底線換為連字號 (-; hyphen)

Parse_Tree 分析 PHP 原始碼並輸出 XML

  • 因為內建的 highlight_file 和 highlight_string 輸出的結果太醜,要改的話又太麻煩,所以找了個替代方案 PECL :: Package :: Parse_Tree 。
  • 該模組只有 parse_tree_from_file() 一個函式、唯一一個參數要傳入原始碼的路徑。這份文件寫的 generate_parse_tree() 是錯的。
  • 使用方法也很簡單,下例會輸出該程式本身分析後的 XML:
    
    <?php
    
    echo parse_tree_from_file(__FILE__);
    ?>
  • 缺點是要另外下載模組,實際要用得把 XML 轉換成 HTML ,對我而言相當不方便。
  • 這研究這個模組途中,才發現 PHP 已經有內建分析原始碼的函式 token_get_all(),詳見下篇。

標籤分類

Labels

Google Analytics Tracking Code

About Me

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