5

当使用未定义的常量时,是否有 php.ini 设置或其他一些技巧来强制 PHP 产生致命错误或类似错误,而不是假设同名字符串的(荒谬的)默认行为?

默认行为可能会带来巨大的安全风险,但通常只会导致应用程序错误。我意识到我可以defined()在请求值之前检查常量的存在,但这会导致冗余/丑陋的代码,并且仍然容易出现开发人员错误。我们非常小心地确保定义了使用的常量,但是这个问题仍然偶尔会潜入生产环境,如果可能的话,我想阻止它。致命错误会更多地“出现在您的面前”,并且不太可能被 QA 挤压。

4

2 回答 2

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 的错误“排名”。

于 2013-05-20T18:25:12.473 回答
2

未定义的常量会生成 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::BARor Foo\BAR)抛出一个致命错误。

因此,如果您希望 PHP 在使用未定义常量时抛出致命错误,另一种解决方案是使用类常量或命名空间常量。

于 2013-05-20T18:24:19.270 回答