побитовые операторы и уровни ошибок (php) - PullRequest
0 голосов
/ 26 января 2011

Я создал обработчик ошибок пользователя и хочу убедиться, что я правильно использую побитовые операторы.

Вот мои настройки конфигурации, чтобы установить, какие ошибки будут обрабатываться каким образом:

// user error logging level (change for production)
define('LEV_USER_ERROR_LOG_LEVEL', E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE);

// user error display level (change for production)
define('LEV_USER_ERROR_DISPLAY_LEVEL', E_USER_ERROR);

Вот как я устанавливаю обработчик ошибок пользователя:

// set user error handler
set_error_handler('user_error_handler', E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE);

Вот сам обработчик ошибок:

    // user error handler
    public static function user_error_handler($error_level, $message, $file_name, $line_number) {
        if (LEV_USER_ERROR_LOG_LEVEL | LEV_USER_ERROR_DISPLAY_LEVEL == 0) return true;
        switch ($error_level) {
            case E_USER_ERROR:
                if (LEV_USER_ERROR_LOG_LEVEL & E_USER_ERROR) {
                    error_log('[' . date('Y-m-d h:i:s') . '] User Error: "' . $message . '", File: "'.$file_name.'", Line: '.$line_number.', Request: "' . $_SERVER['ORIG_PATH_INFO'] . "\"\n", 3, 'application/logs/user_error_log.txt');
                }
                if (LEV_USER_ERROR_DISPLAY_LEVEL & E_USER_ERROR) {
                    echo '[' . date('Y-m-d h:i:s') . '] User Level Error: "' . $message . '", File: "'.$file_name.'", Line: '.$line_number.'<br />';
                }
                die;
                break;
            case E_USER_WARNING:
                if (LEV_USER_ERROR_LOG_LEVEL & E_USER_WARNING) {
                    error_log('[' . date('Y-m-d h:i:s') . '] User Warning: "' . $message . '", File: "'.$file_name.'", Line: '.$line_number.', Request: "' . $_SERVER['ORIG_PATH_INFO'] . "\"\n", 3, 'application/logs/user_error_log.txt');
                }
                if (LEV_USER_ERROR_DISPLAY_LEVEL & E_USER_WARNING) {
                    echo '[' . date('Y-m-d h:i:s') . '] User Level Warning: "' . $message . '", File: "'.$file_name.'", Line: '.$line_number.'<br />';
                }
                break;
            case E_USER_NOTICE:
                if (LEV_USER_ERROR_LOG_LEVEL & E_USER_NOTICE) {
                    error_log('[' . date('Y-m-d h:i:s') . '] User Notice: "' . $message . '", File: "'.$file_name.'", Line: '.$line_number.', Request: "' . $_SERVER['ORIG_PATH_INFO'] . "\"\n", 3, 'application/logs/user_error_log.txt');
                }
                if (LEV_USER_ERROR_DISPLAY_LEVEL & E_USER_NOTICE) {
                    echo '[' . date('Y-m-d h:i:s') . '] User Level Notice: "' . $message . '", File: "'.$file_name.'", Line: '.$line_number.'<br />';
                }
                break;
            default:
                // call PHP internal error handler
                return false;
        }
        // do not call PHP internal error handler
        return true;
    }

Вопросы:

  1. Оператор побитового ИЛИ, используемый в настройках моего обработчика, сделает так, чтобы обработчик ошибок вызывался ТОЛЬКО при возникновении одной из этих трех ошибок?
  2. Оператор побитового ИЛИ, использованный в первой строке моего обработчика ошибок, сделает так, что ТОЛЬКО если оба параметра конфигурации будут установлены на ноль, функция завершится?

1 Ответ

1 голос
/ 26 января 2011

В строке

if (LEV_USER_ERROR_LOG_LEVEL | LEV_USER_ERROR_DISPLAY_LEVEL == 0) return true;

сравнение сильнее, чем побитовый оператор, поэтому вам нужно заключить в скобки:

if ((LEV_USER_ERROR_LOG_LEVEL | LEV_USER_ERROR_DISPLAY_LEVEL) == 0) return true;

Тогда ваш код будет работать так, как вы его описываете.

...