2011-07-26 82 views
1

我有以下的PHP代碼行:PHP錯誤引發

<? 
    ini_set('display_errors', 'On'); 
    error_reporting(E_ALL | E_STRICT); 
    if(file_exist('menu.xml'){ 
    print("file exist"); 
    $xml = simplexml_load_file('menu.xml'); 
    print_r($xml); 
    }else{ 
    print("cant find menu.xml"); 
    exit('failed to open menu.xml'); 
    } 
    ?> 

當我打開這並不顯示在瀏覽器的任何東西(我希望錯誤消息的到來)。我知道在if語句結尾處有一個「)」缺失,但爲什麼不在第一個地方拋出錯誤。 一旦我修復它說未定義的函數file_exist()?根據php Simplexml文檔file_exist是一個有效的func。

+0

您可能會期望它,但我不希望您使用速記公開標籤'',尤其是在您的情況下,因爲您正在使用XML。它是'file_exists',注意's''。 – Shef

+0

你的問題是關於'file_exist'還是關於爲什麼PHP不會爲語法錯誤拋出錯誤? – deceze

+0

確保short_open_tags已打開,否則可能不會將其解釋爲所有的PHP代碼 –

回答

4

你看不到任何東西,因爲語法錯誤防止腳本執行完全。由於該腳本不是有效的PHP,它根本無法執行。所以你的display_errors指令永遠不會執行。相反,使用php.ini中關於錯誤處理的設置,顯然它們被設置爲禁止所有錯誤輸出。

+0

它表示出現ini_set('display_errors','On')語法錯誤時的意思。 error_reporting(E_ALL | E_STRICT);在代碼中沒有效果?不是php解釋語言。這意味着它應該在遇到語法錯誤之前正確執行或考慮這些狀態 – David

+1

@David PHP在開始執行任何代碼之前解析整個文件。作爲解釋型語言並不意味着每一行都在解析*時逐一執行*。 – deceze

+0

感謝您的解釋。我只是改變我的php.ini有display_error = On。當我有「)」缺失時,它仍然不顯示語法錯誤。任何線索? – David

0

你確定你沒有考慮file_exists()嗎?

http://php.net/manual/en/function.file-exists.php

示例代碼的SimpleXML:

<?php 
// The file test.xml contains an XML document with a root element 
// and at least an element /[root]/title. 

if (file_exists('test.xml')) { 
    $xml = simplexml_load_file('test.xml'); 

    print_r($xml); 
} else { 
    exit('Failed to open test.xml.'); 
} 
?> 
0

我想代碼不beceause語法錯誤的執行,因此display_errorserror_reporting仍然被配置爲將系統默認值。

您必須在php.ini中或通過php_flagphp_value .htaccess指令對它們進行配置,以使它們在出現語法錯誤時生效。

+0

它意味着在語法錯誤的情況下有ini_set('display_errors','On'); error_reporting(E_ALL | E_STRICT);在代碼中沒有效果?不是php解釋語言。這意味着它應該在遇到語法錯誤 – David

+1

[見本演示的幻燈片7](http://www.slideshare.net/sebastian_bergmann/php-compiler-internals-1577278)之前正確執行或考慮這些狀態。解析和執行的過程是分開的,在解析器錯誤的情況下將不會執行,因爲解析器需要有一個正確的樹來生成字節碼。 – vstm

+0

感謝它有幫助 – David