2013-10-11 69 views
2

請參見下面的代碼片段:PHP執行路徑(解析器)

<?php 
    die("----die----"); 

    sfafsadffas 

    echo "foo"; 
    echo "bar"; 
?> 

結果是:

Parse error: parse error in test.php on line 6. 

這是一個有點意外,我還以爲我們應該得到----die----

現在看到以下內容:

<?php 
    die("----die----"); 

    echo "foo"; 
    echo "bar"; 

    sfafsadffas 
?> 

結果:

----die---- 

究竟這是怎麼回事?

+0

在例1和;'它執行沒有任何錯誤。 – vbrmnd

+0

如何顯示'解析錯誤:'爲我? – user2092317

回答

-1

第一個失敗,因爲解析器看到是無效的文本和錯誤的。

第二個可能會也可能不會失敗,具體取決於您的PHP解釋器,它可能不會失敗,因爲預處理器(或解析器)忽略文件末尾的無關數據。

-2

實施例1:

它不應該執行。因爲編碼將逐行運行。無效文本將停止執行。最後什麼都不會執行,執行將會失敗。

實施例2:

通過由行執行行的理由兩個回波語句將執行,但最後的執行狀態將失敗。

-1

sfafsadffas在這裏被認爲是一個常數。 在示例1中,在sfafsadffas後面加上分號,並且您正在使用常量,這樣它就可以正常工作。 例2中,你這樣做沒有必要有代碼分號分隔最後一行看到this

0

echo間接影響你的程序:除打印到屏幕/瀏覽器echoflush到它試圖輸出緩衝器打印到目前爲止「彙總」的所有輸出。由於在flush之前存在語法錯誤,因此將在此處發現。您可以通過執行重現了同樣的錯誤:

<?php 
die("----die----"); 

sfafsadffas 
flush(); 
?> 

但是,如果解析器到達語法錯誤之前,你會刷新輸出緩衝區 - 該die將被執行。

<?php 
die("----die----"); 

flush(); 
sfafsadffas 
?> 

將輸出----die----和分析器將停止執行,因爲它died,你不會達到引起語法錯誤就行了。

0

PHP在執行文件時所做的第一件事是運行語法檢查以尋找明顯的錯誤。這包括缺少;分號括號不匹配{}

的第一個片段失敗第一次測試:

<?php 
die("----die----"); 

sfafsadffas // <-- no semicolon between this line of code and the next, 
      //  so you get a 'parse error' before the file even gets run 
echo "foo"; 
echo "bar"; 
?> 

第二個片段生存,因爲PHP的一個小的「功能」語法檢查:解析器以分號計數?>。因此,當您運行時:

<?php 
die("----die----"); 

echo "foo"; 
echo "bar"; 

sfafsadffas 
?> 

語法檢查顯示「OK」,PHP繼續運行該文件。如果sfafsadffas是在文件的早些時候定義的,那麼該文件實際上是完全有效的。

的話,由於你的die,代碼永遠不會,如果你把`sfafsadffas後分號下到第7行