網站製作學習誌

記錄學習製作網站的一切

PHP 小陷阱

最近做一個電子報排程的程式,原本是在 PHP 5 上開發,後來轉到安裝 PHP 4 的正式機上時發生了一些問題。以下是我的記錄:

file_put_contents 函式

我使用 file_put_contents 函式去寫一個暫存檔,在測試機上時一切正常,但是換到正式機上時就一直無法寫入。結果原因是豬頭的我在查閱 PHP 手冊時,沒注意到 file_put_contents 是 PHP 5 才有的函式。解決的辦法很簡單,利用 PEAR 的 PHP_Compat 類別就能解決:

1
2
3
4
5
6
<?php
<strong>require_once ('PHP/Compat.php');</strong>
//...
<strong>PHP_Compat::loadFunction('file_put_contents');</strong>
file_put_contents($file_path, $content);
?>

別名參數

另外一個問題要看以下的函式:

1
function test(<strong>&$test = NULL</strong>) {}

在 PHP 5 底下,上面這段程式是 OK 的;不過一換到 PHP 4 馬上就出問題了。這是因為 PHP 5 可以接受對一個別名參數 (&) 設定預設值,但 PHP 4 不行。

不過如果改成這樣:

1
2
function test(&$test) {}
<strong>test(NULL);</strong>

這樣肯定也會掛點,因為不能直接把 NULL 丟給別名參數。要改成這樣:

1
2
3
function test(&$test) {}
<strong>$a = NULL;</strong>
test($a);

路徑問題

我用 Linux 的排程去執行 PHP 程式時, require_once 會發生找不到引入檔,但是 PEAR 等第三方類別庫卻可以載入的問題。雖然我在 Windows 的測試環境下是可以的,但 Linux 總是無法正常動作。

require_once ('class/MyClass.php');

不過還是有解決的方法,那就是強迫 require_once 從目前程式所在路徑去尋找要引入的檔案。利用 dirname(__FILE__) 就能達到這個目的:

1
require_once (<strong>dirname(__FILE__)</strong> . '/class/MyClass.php');

如果很龜毛的話,也可以這樣寫:

1
2
<strong>$current_path = str_replace('\\', '/', dirname(__FILE__));</strong>
require_once (<strong>$current_path</strong> . '/class/MyClass.php');

這樣就能保證被排程的 PHP 程式能引入正確的檔案了。

Comments