Предопределённые константы
Перечисленные ниже константы всегда доступны как часть ядра PHP.
Замечание: Данные имена констант можно использовать в файле php.ini но не вне PHP, как например в файле httpd.conf , где вместо них необходимо использовать значения их битовых масок.
Значение | Константа | Описание | Примечание |
---|---|---|---|
1 | E_ERROR ( int ) | Фатальные ошибки времени выполнения. Это неустранимые средствами самого скрипта ошибки, такие как ошибка распределения памяти и т.п. Выполнение скрипта в таком случае прекращается. | |
2 | E_WARNING ( int ) | Предупреждения времени выполнения (не фатальные ошибки). Выполнение скрипта в таком случае не прекращается. | |
4 | E_PARSE ( int ) | Ошибки на этапе компиляции. Должны генерироваться только парсером. | |
8 | E_NOTICE ( int ) | Уведомления времени выполнения. Указывают на то, что во время выполнения скрипта произошло что-то, что может указывать на ошибку, хотя это может происходить и при обычном выполнении программы. | |
16 | E_CORE_ERROR ( int ) | Фатальные ошибки, которые происходят во время запуска РНР. Такие ошибки схожи с E_ERROR , за исключением того, что они генерируются ядром PHP. | |
32 | E_CORE_WARNING ( int ) | Предупреждения (не фатальные ошибки), которые происходят во время начального запуска РНР. Такие предупреждения схожи с E_WARNING , за исключением того, что они генерируются ядром PHP. | |
64 | E_COMPILE_ERROR ( int ) | Фатальные ошибки на этапе компиляции. Такие ошибки схожи с E_ERROR , за исключением того, что они генерируются скриптовым движком Zend. | |
128 | E_COMPILE_WARNING ( int ) | Предупреждения на этапе компиляции (не фатальные ошибки). Такие предупреждения схожи с E_WARNING , за исключением того, что они генерируются скриптовым движком Zend. | |
256 | E_USER_ERROR ( int ) | Сообщения об ошибках, сгенерированные пользователем. Такие ошибки схожи с E_ERROR , за исключением того, что они генерируются в коде скрипта средствами функции PHP trigger_error() . | |
512 | E_USER_WARNING ( int ) | Предупреждения, сгенерированные пользователем. Такие предупреждения схожи с E_WARNING , за исключением того, что они генерируются в коде скрипта средствами функции PHP trigger_error() . | |
1024 | E_USER_NOTICE ( int ) | Уведомления, сгенерированные пользователем. Такие уведомления схожи с E_NOTICE , за исключением того, что они генерируются в коде скрипта, средствами функции PHP trigger_error() . | |
2048 | E_STRICT ( int ) | Включаются для того, чтобы PHP предлагал изменения в коде, которые обеспечат лучшее взаимодействие и совместимость кода. | |
4096 | E_RECOVERABLE_ERROR ( int ) | Фатальные ошибки с возможностью обработки. Такие ошибки указывают, что, вероятно, возникла опасная ситуация, но при этом, скриптовый движок остаётся в стабильном состоянии. Если такая ошибка не обрабатывается функцией, определённой пользователем для обработки ошибок (смотрите set_error_handler() ), выполнение приложения прерывается, как происходит при ошибках E_ERROR . | |
8192 | E_DEPRECATED ( int ) | Уведомления времени выполнения об использовании устаревших конструкций. Включаются для того, чтобы получать предупреждения о коде, который не будет работать в следующих версиях PHP. | |
16384 | E_USER_DEPRECATED ( int ) | Уведомления времени выполнения об использовании устаревших конструкций, сгенерированные пользователем. Такие уведомления схожи с E_DEPRECATED за исключением того, что они генерируются в коде скрипта, с помощью функции PHP trigger_error() . | |
32767 | E_ALL ( int ) | Все поддерживаемые ошибки, предупреждения и замечания. |
Представленные выше значения (как числовые, так и символьные) используются для задания битовой маски, определяющей об ошибках какого типа будет даваться отчёт. Вы можете использовать побитовые операторы, чтобы совмещать эти значения для указания определённых типов ошибок. Стоит отметить, что в php.ini допустимы только следующие операторы: ‘|’, ‘
User Contributed Notes 20 notes
[Editor’s note: fixed E_COMPILE_* cases that incorrectly returned E_CORE_* strings. Thanks josiebgoode.]
The following code expands on Vlad’s code to show all the flags that are set. if not set, a blank line shows.
= error_reporting ();
for ( $i = 0 ; $i 15 ; $i ++ ) <
print FriendlyErrorType ( $errLvl & pow ( 2 , $i )) . «
\\n» ;
>
function FriendlyErrorType ( $type )
<
switch( $type )
<
case E_ERROR : // 1 //
return ‘E_ERROR’ ;
case E_WARNING : // 2 //
return ‘E_WARNING’ ;
case E_PARSE : // 4 //
return ‘E_PARSE’ ;
case E_NOTICE : // 8 //
return ‘E_NOTICE’ ;
case E_CORE_ERROR : // 16 //
return ‘E_CORE_ERROR’ ;
case E_CORE_WARNING : // 32 //
return ‘E_CORE_WARNING’ ;
case E_COMPILE_ERROR : // 64 //
return ‘E_COMPILE_ERROR’ ;
case E_COMPILE_WARNING : // 128 //
return ‘E_COMPILE_WARNING’ ;
case E_USER_ERROR : // 256 //
return ‘E_USER_ERROR’ ;
case E_USER_WARNING : // 512 //
return ‘E_USER_WARNING’ ;
case E_USER_NOTICE : // 1024 //
return ‘E_USER_NOTICE’ ;
case E_STRICT : // 2048 //
return ‘E_STRICT’ ;
case E_RECOVERABLE_ERROR : // 4096 //
return ‘E_RECOVERABLE_ERROR’ ;
case E_DEPRECATED : // 8192 //
return ‘E_DEPRECATED’ ;
case E_USER_DEPRECATED : // 16384 //
return ‘E_USER_DEPRECATED’ ;
>
return «» ;
>
?>
-1 is also semantically meaningless as a bit field, and only works in 2s-complement numeric representations. On a 1s-complement system -1 would not set E_ERROR. On a sign-magnitude system -1 would set nothing at all! (see e.g. http://en.wikipedia.org/wiki/Ones%27_complement)
If you want to set all bits,
0 is the correct way to do it.
But setting undefined bits could result in undefined behaviour and that means *absolutely anything* could happen 🙂
A simple and neat way to get the error level from the error code. You can even customize the error level names further.
= [
E_ERROR => «E_ERROR» ,
E_WARNING => «E_WARNING» ,
E_PARSE => «E_PARSE» ,
E_NOTICE => «E_NOTICE» ,
E_CORE_ERROR => «E_CORE_ERROR» ,
E_CORE_WARNING => «E_CORE_WARNING» ,
E_COMPILE_ERROR => «E_COMPILE_ERROR» ,
E_COMPILE_WARNING => «E_COMPILE_WARNING» ,
E_USER_ERROR => «E_USER_ERROR» ,
E_USER_WARNING => «E_USER_WARNING» ,
E_USER_NOTICE => «E_USER_NOTICE» ,
E_STRICT => «E_STRICT» ,
E_RECOVERABLE_ERROR => «E_RECOVERABLE_ERROR» ,
E_DEPRECATED => «E_DEPRECATED» ,
E_USER_DEPRECATED => «E_USER_DEPRECATED» ,
E_ALL => «E_ALL»
];
echo $exceptions [ «1» ];
$code = 256 ;
echo $exceptions [ $code ];
?>
Output:
E_ERROR
E_USER_ERROR
This will need updating when PHP updates the error level names. Otherwise, it works just fine.
An other way to get all PHP errors that are set to be reported. This code will even work, when additional error types are added in future.
= 0 ;
foreach ( array_reverse ( str_split ( decbin ( error_reporting ()))) as $bit ) <
if ( $bit == 1 ) <
echo array_search ( pow ( 2 , $pot ), get_defined_constants ( true )[ ‘Core’ ]). «
\n» ;
>
$pot ++;
>
?>
A neat way to have a place in code to control error reporting configuration 🙂
= [
E_ERROR => FALSE ,
E_WARNING => TRUE ,
E_PARSE => TRUE ,
E_NOTICE => TRUE ,
E_CORE_ERROR => FALSE ,
E_CORE_WARNING => FALSE ,
E_COMPILE_ERROR => FALSE ,
E_COMPILE_WARNING => FALSE ,
E_USER_ERROR => TRUE ,
E_USER_WARNING => TRUE ,
E_USER_NOTICE => TRUE ,
E_STRICT => FALSE ,
E_RECOVERABLE_ERROR => TRUE ,
E_DEPRECATED => FALSE ,
E_USER_DEPRECATED => TRUE ,
E_ALL => FALSE ,
];
error_reporting (
array_sum (
array_keys ( $errorsActive , $search = true )
)
);
super simple error code to human readable conversion:
function prettycode($code) <
return $code == 0 ? «FATAL» : array_search($code, get_defined_constants(true)[‘Core’]);
>
Notes posted above limited to current errors level as on 26th Aug 2016, following snippet will work even on introduction of new error level
$errLvl = error_reporting();
for ( $i = 1; $i
As for me, the best way to get error name by int value is that. And it’s works fine for me 😉
( array_slice ( get_defined_constants ( true )[ ‘Core’ ], 1 , 15 , true ))[ $type ];
//the same in readable form
array_flip (
array_slice (
get_defined_constants ( true )[ ‘Core’ ],
1 ,
15 ,
true
)
)[ $type ]
A shorter version of vladvarna’s FriendlyErrorType($type)
function getErrorTypeByValue ( $type ) <
$constants = get_defined_constants ( true );
foreach ( $constants [ ‘Core’ ] as $key => $value ) < // Each Core constant
if ( preg_match ( ‘/^E_/’ , $key ) ) < // Check error constants
if ( $type == $value )
return( » $key = $value » );
>
>
> // getErrorTypeByValue()
echo «[» . getErrorTypeByValue ( 1 ) . «]» . PHP_EOL ;
echo «[» . getErrorTypeByValue ( 0 ) . «]» . PHP_EOL ;
echo «[» . getErrorTypeByValue ( 8 ) . «]» . PHP_EOL ;
?>
Will give
[E_ERROR=1]
[]
[E_NOTICE=8]
My version!
For long list function returns for example «E_ALL without E_DEPRECATED «
function errorLevel()
<
$levels = array(
‘E_ERROR’,
‘E_WARNING’,
‘E_PARSE’,
‘E_NOTICE’,
‘E_CORE_ERROR’,
‘E_CORE_WARNING’,
‘E_COMPILE_ERROR’,
‘E_COMPILE_WARNING’,
‘E_USER_ERROR’,
‘E_USER_WARNING’,
‘E_USER_NOTICE’,
‘E_STRICT’,
‘E_RECOVERABLE_ERROR’,
‘E_DEPRECATED’,
‘E_USER_DEPRECATED’,
‘E_ALL’
);
$excluded = $included = array();
$errLvl = error_reporting();
foreach ($levels as $lvl) <
$val = constant($lvl);
if ($errLvl & $val) <
$included []= $lvl;
> else <
$excluded []= $lvl;
>
>
if (count($excluded) > count($included)) <
echo ‘
Consist: ‘.implode(‘,’, $included);
> else <
echo ‘
Consist: E_ALL without ‘.implode(‘,’, $excluded);
>
>
Well, technically -1 will show all errors which includes any new ones included by PHP. My guess is that E_ALL will always include new error constants so I usually prefer:
( E_ALL | E_STRICT );
?>
Reason being: With a quick glance anyone can tell you what errors are reported. -1 might be a bit more cryptic to newer programmers.
this would give you all the reported exception list of your configuration.
Ошибки PHP: классификация, примеры, обработка
В статье представлена очередная попытка разобраться с ошибками, которые могут встретиться на вашем пути php-разработчика, их возможная классификация, примеры их возникновения, влияние ошибок на ответ клиенту, а также инструкции по написанию своего обработчика ошибок.
Классификация ошибок
Примеры возникновения ошибок
Примечание: для полной работоспособности скрипта необходим PHP версии не ниже 5.3.0.
В файле errors.php представлены выражения, инициирующие практически все возможные ошибки. Исключение составили: E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_WARNING, генерируемые ядром Zend. В теории, встретить их в реальной работе вы не должны.
В следующей таблице приведены варианты поведения этого скрипта в различных условиях (в зависимости от значений директив display_errors и error_reporting):
Группа ошибок | Значения директив * | Статус ответа сервера | Ответ клиенту ** |
---|---|---|---|
E_PARSE, E_COMPILE_ERROR *** | display_errors = off error_reporting = ANY | 500 | Пустое значение |
display_errors = on error_reporting = ANY | 200 | Сообщение об ошибке | |
E_USER_ERROR, E_ERROR, E_RECOVERABLE_ERROR | display_errors = off error_reporting = ANY | 500 | Вывод скрипта до ошибки |
display_errors = on error_reporting = ANY | 200 | Сообщение об ошибке и вывод скрипта до ошибки | |
Не фатальные ошибки | display_errors = off error_reporting = ANY и display_errors = on error_reporting = 0 | 200 | Весь вывод скрипта |
display_errors = on error_reporting = E_ALL | E_STRICT | 200 | Сообщение об ошибке и весь вывод скрипта |
* Значение ANY означает E_ALL | E_STRICT или 0.
** Ответ клиенту может отличаться от ответов на реальных скриптах. Например, вывод какой-либо информации до включения файла errors.php, будет фигурировать во всех рассмотренных случаях.
*** Если в файле errors.php заменить пример для ошибки E_COMPILE_ERROR на require «missing_file.php»; , то ошибка попадет во вторую группу.
Значение, приведенной выше, таблицы можно описать следующим образом:
- Наличие в файле скрипта ошибки, приводящей его в «негодное» состояние (невозможность корректно обработать), на выходе даст пустое значение или же только само сообщение об ошибке, в зависимости от значения директивы display_errors.
- Скрипт в файле с фатальной ошибкой, не относящейся к первому пункту, будет выполняться в штатном режиме до самой ошибки.
- Наличие в файле фатальной ошибки при display_errors = Off обозначит 500 статус ответа.
- Не фатальные ошибки, как и следовало ожидать, в контексте возможности исполнения скрипта в целом, на работоспособность не повлияют.
Собственный обработчик ошибок
Для написания собственного обработчика ошибок необходимо знать, что:
- для получения информации о последней произошедшей ошибке существует функция error_get_last();
- для определения собственного обработчика ошибок существует функция set_error_handler(), но фатальные ошибки нельзя «перехватить» этой функцией;
- используя register_shutdown_function(), можно зарегистрировать свою функцию, выполняемую по завершении работы скрипта, и в ней, используя знания из первого пункта, если фатальная ошибка имела место быть, предпринять необходимые действия;
- сообщение о фатальной ошибке в любом случае попадет в буфер вывода;
- воспользовавшись функциями контроля вывода можно предотвратить отображение нежелательной информации;
- при использовании оператора управления ошибками (знак @) функция, определенная в set_error_handler() все равно будет вызвана, но функция error_reporting() в этом случае вернет 0, чем и можно пользоваться для прекращения работы или определения другого поведения своего обработчика ошибок.
Третий пункт поясню: зарегистрированная нами функция при помощи register_shutdown_function() выполнится в любом случае — корректно ли завершился скрипт, либо же был прерван в связи с критичной (фатальной) ошибкой. Второй вариант мы можем однозначно определить, воспользовавшись информацией предоставленной функцией error_get_last(), и, если ошибка все же была, выполнить наш собственный обработчик ошибок.
Продемонстрируем вышесказанное на модифицированном скрипте index.php:
Не забываем, что ошибки смешанного типа, после объявления собственного обработчика ошибок, стали не фатальными. Плюс к этому, весь вывод скрипта до фатальной ошибки вместе с стандартным сообщением об ошибке будет сброшен.
Вообще, рассмотренный пример обработчика ошибок, обработкой, как таковой, не занимается, а только демонстрирует саму возможность. Дальнейшее его поведение зависит от ваших желаний и/или требований. Например, все случаи обращения к обработчику можно записывать в лог, а в случае фатальных ошибок, дополнительно, уведомлять об этом администратора ресурса.