2013-05-20 42 views
5

是否有php.ini設置或其他一些技巧來強制PHP在使用未定義的常量時產生致命錯誤或類似錯誤,而不是假設同名字符串的(可笑的)默認行爲?更改未定義常量的PHP行爲?

默認行爲可能是一個巨大的安全風險,但更多的時候會導致應用程序錯誤。我意識到我可以使用defined()在請求值之前檢查常量的存在,但這會導致冗餘/醜陋的代碼,並且仍然容易出現開發人員錯誤。我們非常小心地確保使用的常量已經定義好,但是這個問題偶爾會潛入到生產中,如果可能的話,我想盡量避免它。一個致命的錯誤會更多地「在你的臉上」,並且不太可能被QA擠壓。

回答

2

未定義的常量會生成PHP通知。如果你只想處理undefined constant警告,測試如果$errstr比賽對Use of undefined constant FOO - assumed 'FOO'

set_error_handler(function ($errno, $errstr, $errfile, $errline) { 

    throw new ErrorException($errstr, $errno, 1, $errfile, $errline); 

    // or turn it in a fatal error 

    trigger_error($errstr, E_USER_ERROR); 
}); 

你可以只是把任何PHP警告例外,至少在開發模式。


注意:只有非限定的全局常量表現得像這樣。 PHP爲未定義的類常量和未定義的名稱空間常量(例如Foo::BARFoo\BAR)引發致命錯誤。

因此,如果您希望PHP在使用未定義的常量時拋出致命錯誤,則另一種解決方案是使用類常量或名稱空間常量。

+0

+1。我知道類常量,但我總是認爲命名空間常量在這方面與不合格的常量相同。謝謝你的提示。 – FtDRbwLXw6

3
set_error_handler(function($type, $error) { 
    if(stripos($error, 'Use of undefined constant') !== FALSE) 
    { 
     // god forbid - someone's used an undefined constant. Act appropriately. 
     trigger_error($error, E_USER_ERROR); // Triggers a fatal error. 
     return TRUE; 
    } 
}, E_NOTICE); 

這是也許你在找什麼,據我所知沒有辦法修改PHP的錯誤「排名」。

+0

這正是我寫的;) – smassey