2008-10-25 28 views
25

Zend Framework編碼標準提到以下內容:什麼是PHP的結束標籤只PHP文件的參數?

對於僅包含PHP代碼的文件,絕不允許使用結束標記(「?>」)。它不是PHP所要求的,省略它可以防止意外地將尾隨空白注入響應中。

不過我記得聽到有關的問題(與工具或包括可能?),其中所需的文件有關閉標籤。

有沒有人知道任何問題(除了需要對稱的開發人員問題)您需要關閉標籤還是他們通常是一個壞主意?

回答

25

當你可以移除結束標記時,它可能是一個最佳實踐。原因是因爲如果你在php文件的?>之外有任何字符(甚至是空白),它可以阻止諸如頭部之類的東西停止工作,如果在頭部被設置之前字符被髮送到瀏覽器。

+0

我同意在可能的情況下應該從PHP專用文件中省略結束標記。但是,正如其他人發佈的情況(幾個)不包括結束標記會導致代碼中斷。 – ZCHudson 2008-10-25 16:50:43

+2

?>之後的空格是個問題,這並不完全準確。結束後一個新行字符?>不是問題;它將被解析器使用並且不會被回顯。這是爲了與所有需要在所有行末尾換行的許多文本編輯器兼容。 – thomasrutter 2009-03-19 01:11:06

+1

問題是如果您使用Windoze編輯器,則會插入,這會導致發出http輸出。 – dar7yl 2010-02-20 21:54:47

0

我們的辦公室使用Flash中構建的電子學習應用程序,我們很早就發現,如果從服務器端腳本中省略結束標記,那麼它會打破我們與e-learnng應用程序的通信機制。

有一點需要注意的是,我們的debuggng過程並沒有先在簡化的環境中嘗試它,以確保它不是缺少的結束標記和來自某些其他腳本的錯誤輸出的組合。 ..

1

我們使用Drupal,它總是省略結束標記,因此它從來沒有任何問題。

因爲它一直爲Drupal工作(我從閱讀手冊知道它是可選的),所以我曾經創建了一個沒有結束標籤的配置文件(只包含PHP代碼)。出於某種原因,直到(在同事的堅持下),我才添加了結束標籤。我們當時沒有試圖找出原因。

我總是在寫代碼的時候使用結束標籤;它看起來更加簡單,概念上「關閉」了開始標籤,並且我總是小心不要在結束標籤之後留下任何額外的空白。

0

在回覆@ gabriel1836時,服務器端的結束標記與Flash應用程序無關;與Flash應用程序的遠程請求相關的是服務器返回的有效負載。僅在僅限PHP的文件上省略結束標記纔會影響此操作,以確保在將標頭髮送到Flash應用程序之前不會返回虛假輸出。

回覆@CesarB,除非你能給出一個具體的,可重複的例子,否則你所做的只是傳播FUD。 PHP手冊非常清楚,結束標記是可選的。

+0

如何說明我的FUD發生了什麼? (我也多次看到關閉標記不被使用,特別是Drupal從不使用它,這就是爲什麼我試圖在該特定文件上省略它,認爲它沒有什麼區別 - 甚至更多,因爲我已經閱讀了那部分手冊)。 – CesarB 2008-10-25 17:14:19

+0

事實上,我不相信它會有所作爲,Web開發人員不得不堅持幾次,以便在我之前嘗試添加?>。在我添加結束標記後,所有內容突然開始工作。 – CesarB 2008-10-25 17:32:17

1

我總是使用閉合標籤,沒有它們就顯得不好看。這也不是一個有效的XML沒有他們的處理指令(不是你關心,如果文件中唯一的東西是PHP)

4

你可以考慮PHP的開放標籤爲PHP的文件,作爲一種shebang線(像#!/ bin/bash),這樣就不需要結束標記。

我們也遵循ZF標準,沒有關閉php標籤的文件。但是我從來沒有聽說過任何工具由於缺少結束標籤而無法解析文件,而且我還沒有遇到過任何問題,因爲它沒有使用它。

11

如果您使用關閉PHP標籤,那麼您可以輕鬆找到意外截斷的文件(例如,尚未完全上傳)。
但是,這樣的問題應該通過使文件系統和傳輸可靠而不是添加PHP「​​canary」標籤來解決:)

另一個可能的原因是PEAR編碼標準需要它。他們需要它,因爲他們需要它,而且你不能質疑PEAR編碼標準。

3

我總是爲php文件編寫結束標記,並且有目的地不用空格或eol來跟着它。

該標準意味着如果省略了結束標記,則會隱式提供一個。但是這並不能解決開發者編寫合適的html/xml的問題。

並且可能有兩個文件在html/php處理之外組合的情況,並且缺少標籤會導致極度的悲傷。

2

我總是把他們,因爲我認爲它們是一個奇特的右大括號 - 當我寫的條件和循環,我把在打開/關閉的一對括號寫代碼之前,我用PHP文件執行。

無論是「正確」與否,我半經常發現自己轉向「純粹」的PHP文件到「nonpure」,和結束標記是非常有用的。

1

拼接多個文件時,檢查編碼錯誤不起作用。我使用以下shell命令來檢查錯誤。

find . -name '*.php' | xargs cat | php -l 

當然下面的命令仍然有效(並顯示已損壞的文件的文件名)

find . -name '*.php' | while read filename; do php -l $filename | grep -v 'No syntax errors '; done 

但是這一次是非常慢得多。