2007/09/04

PHP 消失的 ?>

一般 PHP 程式都是以 <?php 開頭,以 ?> 結束。可是不時會發現一些套件裡的 php 檔,沒有用 ?> 結束,感覺好像是漏掉了一樣。
直到最近才瞭解這是怎麼一回事,原來消失的 ?> 是有含意在裡頭的。

寫程式時難免會 include 或 require 其他檔案,對於 php 來說,如果引入的檔案最後有多餘的空白或換行,有時候就會出問題。
舉例來說,假設有兩個程式 inc.php 與 endofphpfile.php,程式內容如下:

// inc.php
$filename = 'php.jpg';
?>

// endofphpfile.php
require_once "inc.php";
$size = getimagesize($filename);
$fp = f o p e n($filename, "rb");
if ($size && $fp) {
h e a d e r ("Content-type: {$size['mime']}");
f p a s s t h ru ($fp);
exit;
}
?>
開啟 endofphpfile.php 可以看到 PHP 的 icon(範例一)。

但如果 inc.php 的文末多了一個換行,就像下圖這樣:
20070903_endofphpfile_1rn
這樣也還是可以看到圖檔(範例二)。

可是如果換成是多了兩個換行:
20070903_endofphpfile_2rn
這下就看不到圖檔了(範例三)。

可是如果換成是有三個換行:
20070903_endofphpfile_3rn
一樣看不到圖檔(範例四)。

因此如果把 ?>拿掉呢?
20070903_endofphpfile_0
就能看到原本的圖檔了(範例五)!

其他在下載檔案或直接丟 content 出去的狀況,都會遇到類似的狀況(瀏覽器會先收到額外的換行)。
因此,為了避免引入檔案時衍生的不必要的麻煩,就把 php 檔最後的 ?> 拿掉,避免送出額外的空白或換行。

沒有留言:

張貼留言