更改未定义常量的PHP行为?

时间:2013-05-20 18:00:00

标签: php

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

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

2 个答案:

答案 0 :(得分: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的错误'排名'。

答案 1 :(得分: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::BARFoo\BAR)抛出致命错误。

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