PHP Error Reporting Levels – WTF is 6134?

In PHP, the error reporting level (whether errors go to the log or to the screen or whatever) is determinded by the error_reporting INI directive (or at runtime using the error_reporting() function). Both take an integer as their value – and usually this integer is represented by error level constants like E_ALL, E_STRICT or E_USER_WARNING.

So in order to set the error reporting to anything but notices and strict errors, you would set something like this in php.ini:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

(actually, E_ALL does not really include E_STRICT but I put it here just to be more explicit)

This is actually great – one of the more easy to use and understand APIs in my opinion (yeah, I really like bitwise operations).

However, what I really hate is that sometimes I need to work with the integer value of the error reporting level (like 1 for E_ERROR or 84 for E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR) and it’s very hard for me to remember what arbitrary numbers like 6134 mean.

So, today I wrote this tiny CLI script that helps me understand what an arbitrary error_reporting level integer might mean:

<?php

$errorLevels = array(
        'E_COMPILE_ERROR'     => E_COMPILE_ERROR,
        'E_COMPILE_WARNING'   => E_COMPILE_WARNING,
        'E_CORE_ERROR'        => E_CORE_ERROR,
        'E_CORE_WARNING'      => E_CORE_WARNING,
        'E_ERROR'             => E_ERROR,
        'E_NOTICE'            => E_NOTICE,
        'E_PARSE'             => E_PARSE,
        'E_RECOVERABLE_ERROR' => E_RECOVERABLE_ERROR,
        'E_STRICT'            => E_STRICT,
        'E_USER_ERROR'        => E_USER_ERROR,
        'E_USER_NOTICE'       => E_USER_NOTICE,
        'E_USER_WARNING'      => E_USER_WARNING,
        'E_WARNING'           => E_WARNING,
);

if (! isset($_SERVER['argv'][1])) {
        fprintf(STDERR, "Usage: {$_SERVER['argv'][0]} <error_level>n" .
                        "  Where <error_level> is a PHP error reporting leveln");
        exit(1);
}

$level = $_SERVER['argv'][1];

echo "Error level $level includes:n";
foreach ($errorLevels as $k => $v) {
        if ($level & $v) echo "t $k n";
}

echo "n";

To use, just run the script with a single value parameter, like so:

shahar.e@wintergreen ~ $ php error_level.php 6134
Error level 6134 includes:
	 E_COMPILE_ERROR 
	 E_COMPILE_WARNING 
	 E_CORE_ERROR 
	 E_CORE_WARNING 
	 E_PARSE 
	 E_RECOVERABLE_ERROR 
	 E_USER_ERROR 
	 E_USER_NOTICE 
	 E_USER_WARNING 
	 E_WARNING 

Enjoy!