当使用未定义的常量时,是否有 php.ini 设置或其他一些技巧来强制 PHP 产生致命错误或类似错误,而不是假设同名字符串的(荒谬的)默认行为?
默认行为可能会带来巨大的安全风险,但通常只会导致应用程序错误。我意识到我可以defined()
在请求值之前检查常量的存在,但这会导致冗余/丑陋的代码,并且仍然容易出现开发人员错误。我们非常小心地确保定义了使用的常量,但是这个问题仍然偶尔会潜入生产环境,如果可能的话,我想阻止它。致命错误会更多地“出现在您的面前”,并且不太可能被 QA 挤压。
当使用未定义的常量时,是否有 php.ini 设置或其他一些技巧来强制 PHP 产生致命错误或类似错误,而不是假设同名字符串的(荒谬的)默认行为?
默认行为可能会带来巨大的安全风险,但通常只会导致应用程序错误。我意识到我可以defined()
在请求值之前检查常量的存在,但这会导致冗余/丑陋的代码,并且仍然容易出现开发人员错误。我们非常小心地确保定义了使用的常量,但是这个问题仍然偶尔会潜入生产环境,如果可能的话,我想阻止它。致命错误会更多地“出现在您的面前”,并且不太可能被 QA 挤压。
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 的错误“排名”。
未定义的常量会生成 PHP 通知。
至少在开发模式下,您可以为任何 PHP 警告抛出异常:
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);
});
如果您只想处理undefined constant
警告,请测试是否$errstr
匹配Use of undefined constant FOO - assumed 'FOO'
.
注意:只有不合格的全局常量才会这样。PHP 对未定义的类常量和未定义的命名空间常量(例如Foo::BAR
or Foo\BAR
)抛出一个致命错误。
因此,如果您希望 PHP 在使用未定义常量时抛出致命错误,另一种解决方案是使用类常量或命名空间常量。