2013-01-23 19 views
6

這個讓我困擾了一會兒。比方說,我們有一個簡單的PHP文件:PHP在PHP /明文混合模式下吃掉換行

Line 0 
Line 1 
<?="Line 2"?> 
Line 3 

處理該文件將導致:

Line 0 
Line 1 
Line 2Line 3 

哪裏?>後改行去了?在結束標記後放置某個字符時,換行不會被吞噬(例如?>.)。

有沒有辦法控制這種行爲?我不願意在結束標記之後放置空格,因爲我的IDE配置爲在換行之前刪除空格(並且我喜歡這種方式)。

+0

嘗試'<?=「第2行\ n」?>' –

+1

請勿使用HTML模式生成文本文件;這是要求麻煩:) –

+0

添加一個額外的換行符當然會起作用,但是我寧願使用PHP來節省我的第一個換行符。 –

回答

5

是的,確實如下:

塊的結束標記將包含緊接着的尾隨換行符(如果存在的話)。

http://php.net/manual/en/language.basic-syntax.instruction-separation.php

含義,如果?>是上線的最後一件事,換行符將被關閉PHP塊中移除。您需要明確echo一個換行符或添加一個額外的換行符。

+0

這種行爲對我來說沒有意義。爲什麼會有人想要這個?應該有辦法在某天關閉它: -/ –

+1

@Felix有些代碼塊不會生成輸出,並且您不一定希望它們遍佈整個地方亂拋垃圾;說'<?php foreach($ foo as $ bar):?>'。是的,PHP所做的不是一個好的解決方案。 ERB for Ruby和其他人有*空格控制*,例如' - %>'('-'控制輸出或不輸出下面的換行/空格)。 PHP應該添加。 – deceze

1

除了<?php?>標籤之外,PHP解釋器以HTML模式運行,HTML模式內部的間距不像文本內容那樣大。

用PHP生成文字,你應該使用普通字符串,建立自己的輸出以這種方式:

$var = "Line 2"; 
$s = "Line 0\nLine 1\n$var\nLine3"; 

至少這不會給你一個討厭的,但documented,驚喜:)

4

這個is actually a feature(相信與否)。 PHP消耗換行,如果它直接跟隨一個PHP閉標籤:

用於該塊的結束標記將包括立即尾隨 換行符如果存在。

這很清楚,這樣當一個空白行結尾的PHP文件在另一個腳本的included時不會在輸出中產生換行符。所以這是一個真正的「保護無知」特徵,我們必須在可預見的將來與之共存。

如果您確實需要換行符,還有其他選項:從簡單地將兩個換行符(第二行將工作!)從代碼中回顯換行符。