预定义常量

以下常量始终作为 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) PHP 初始化启动期间发生的致命错误。这类似于 E_ERROR,只是它是由 PHP 核心生成的。  
32 E_CORE_WARNING (int) PHP 初始化启动期间发生的警告(非致命错误)。这类似于 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 代码中使用 PHP 函数 trigger_error() 生成的。  
512 E_USER_WARNING (int) 用户生成的警告消息。这类似于 E_WARNING,只是它是在 PHP 代码中使用 PHP 函数 trigger_error() 生成的。  
1024 E_USER_NOTICE (int) 用户生成的通知消息。这类似于 E_NOTICE,只是它是在 PHP 代码中使用 PHP 函数 trigger_error() 生成的。  
2048 E_STRICT (int) 启用以使 PHP 建议对您的代码的更改,这些更改将确保您的代码具有最佳的互操作性和向前兼容性。  
4096 E_RECOVERABLE_ERROR (int) 可捕获的致命错误。它表示可能发生了危险的错误,但没有使引擎处于不稳定状态。如果该错误没有被用户定义的处理程序捕获(另请参见 set_error_handler()),应用程序将像 E_ERROR 一样中止。  
8192 E_DEPRECATED (int) 运行时通知。启用此选项以接收有关未来版本中不再有效的代码的警告。  
16384 E_USER_DEPRECATED (int) 用户生成的警告消息。这类似于 E_DEPRECATED,只是它是在 PHP 代码中使用 PHP 函数 trigger_error() 生成的。  
32767 E_ALL (int) 所有错误、警告和通知。  

上述值(数值或符号)用于构建一个位掩码,该位掩码指定要报告哪些错误。您可以使用 按位运算符 来组合这些值或屏蔽某些类型的错误。请注意,只有 '|'、'~'、'!'、'^' 和 '&' 将在 php.ini 中被理解。

添加注释

用户贡献的注释 21 个注释

Andy at Azurite (co uk)
13 年前
-1 作为位域在语义上也是无意义的,并且只在 2 的补码数值表示中起作用。在 1 的补码系统中,-1 不会设置 E_ERROR。在符号位数值表示系统中,-1 根本不会设置任何内容!(例如,参见 http://en.wikipedia.org/wiki/Ones%27_complement

如果您想设置所有位,~0 是正确的方法。

但是,设置未定义的位可能会导致未定义的行为,这意味着任何事情都可能发生 :-)
fadhilinjagi at gmail dot com
2 年前
一个简单而简洁的方法,可以从错误代码中获取错误级别。您甚至可以进一步自定义错误级别的名称。

<?php
$exceptions
= [
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];
?>

输出
E_ERROR
E_USER_ERROR

这将需要在 PHP 更新错误级别的名称时进行更新。否则,它可以正常工作。
paulsnar
6 年前
PHP 7 使 E_STRICT 变得无关紧要,将大多数错误重新分类为适当的警告、通知或 E_DEPRECATED:https://wiki.php.net/rfc/reclassify_e_strict
russthom at fivegulf dot com
12 年前
[编辑注:修复了错误返回 E_CORE_* 字符串的 E_COMPILE_* 案例。感谢 josiebgoode。]

以下代码扩展了 Vlad 的代码,以显示所有设置的标志。如果没有设置,将显示空白行。

<?php
$errLvl
= error_reporting();
for (
$i = 0; $i < 15; $i++ ) {
print
FriendlyErrorType($errLvl & pow(2, $i)) . "<br>\\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
"";
}
?>
bbrokman at gmail dot com
5 年前
在代码中控制错误报告配置的一个好方法:)

<?php

$errorsActive
= [
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)
)
);

?>
cl at viazenetti dot de
6 年前
另一种获取所有设置为报告的 PHP 错误的方法。即使将来添加了其他错误类型,这段代码也能正常工作。

<?php
$pot
= 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']). "<br>\n";
}
$pot++;
}
?>
ali6236 at yahoo dot com
1 年前
将错误常量映射到其名称的更好方法(而不是使用 switch)

function getErrorName($code)
{
static $error_names = [
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',
];
return $error_names[$code] ?? '';
}
ahsankhatri1992 at gmail
7 年前
以上发布的注释仅限于 2016 年 8 月 26 日的当前错误级别,以下代码片段即使在引入新的错误级别时也能正常工作

$errLvl = error_reporting();
for ( $i = 1; $i < E_ALL; $i*=2 )
{
print FriendlyErrorType($errLvl & $i) . "<br>\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 "";
}
kezzyhko at NOSPAM dot semysha dot ru
8 年前
对我来说,通过整数获取错误名称的最佳方法是这个。对我来说效果很好;)
<?php

array_flip
(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]

?>
kaioker
2 年前
超级简单的错误代码到人类可读的转换

function prettycode($code){
return $code == 0 ? "FATAL" : array_search($code, get_defined_constants(true)['Core']);
}
ErikBachmann
5 年前
Vladvarna 的 FriendlyErrorType($type) 的一个简短版本
<?php
function getErrorTypeByValue($type) {
$constants = get_defined_constants(true);

foreach (
$constants['Core'] as $key => $value ) { // 每个 Core 常量
if ( preg_match('/^E_/', $key ) ) { // 检查错误常量
if ( $type == $value )
return(
"$key=$value");
}
}
}
// getErrorTypeByValue()

echo "[".getErrorTypeByValue( 1 ) . "]". PHP_EOL;
echo
"[".getErrorTypeByValue( 0 ) . "]". PHP_EOL;
echo
"[".getErrorTypeByValue( 8 ) . "]". PHP_EOL;
?>

将输出
[E_ERROR=1]
[]
[E_NOTICE=8]
匿名
8 年前
我的版本!
对于较长的列表,函数将返回例如“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 '<br />Consist: '.implode(',', $included);
} else {
echo '<br />Consist: E_ALL without '.implode(',', $excluded);
}
}
PhpMyCoder
14 年前
严格来说,-1 会显示所有错误,包括 PHP 中包含的任何新错误。我的猜测是 E_ALL 将始终包含新的错误常量,因此我通常更喜欢

<?php
error_reporting
(E_ALL | E_STRICT);
?>

原因是:一目了然,任何人都可以告诉你报告了哪些错误。-1 对于新手程序员来说可能有点神秘。
vladvarna at gmail dot com
12 年前
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_CORE_ERROR: // 64 //
return 'E_COMPILE_ERROR';
case E_CORE_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 $type;
}
damian at thebestisp dot dot dot com
8 年前
我看到 Chris 似乎认为错误在某些情况下可能会组合在一起,我不知道任何情况,但他的代码过于冗长、效率低下,并且没有考虑到未来的 E_ 常量。这是我处理多个错误(可能永远不会发生)的版本,它以我的其他代码为基础。唯一的真正区别是,它不费力地将未定义的位分离出来,这几乎没有用,而且如果你有超过几个位设置为 2**14 以上(0 到 14 有一个相关的错误),就会变得很乱。

<?php
function friendly_error_type($type) {
static
$levels=null;
if (
$levels===null) {
$levels=[];
foreach (
get_defined_constants() as $key=>$value) {
if (
strpos($key,'E_')!==0) {continue;}
$levels[$value]=substr($key,2);
}
}
$out=[];
foreach (
$levels as $int=>$string) {
if (
$int&$type) {$out[]=$string;}
$type&=~$int;
}
if (
$type) {$out[]="Error Remainder [{$type}]";}
return
implode(' & ',$out);
}
echo
friendly_error_type(E_ERROR|E_USER_DEPRECATED); //ERROR & USER_DEPRECATED
echo friendly_error_type(2**20-1); //ERROR & RECOVERABLE_ERROR & WARNING & PARSE & NOTICE & STRICT & DEPRECATED & CORE_ERROR & CORE_WARNING & COMPILE_ERROR & COMPILE_WARNING & USER_ERROR & USER_WARNING & USER_NOTICE & USER_DEPRECATED & Error Remainder [1015808]
?>
damian at thebestisp dot dot dot com
8 年前
我使用这段代码来帮助模拟默认的错误处理程序,唯一的区别是级别最终变成了全部大写,我不在乎要修复它。你也可以去掉下划线,但我还是不在乎:P
在 PHP 开始添加以 E_ 开头的常量,这些常量的值与其他 E_ 常量重叠之前,这似乎是将错误代码整数转换为肉袋可以理解的字符串的最短方法。它也适用于新类型,所以这很好。
<?php
function friendly_error_type($type) {
static
$levels=null;
if (
$levels===null) {
$levels=[];
foreach (
get_defined_constants() as $key=>$value) {
if (
strpos($key,'E_')!==0) {continue;}
$levels[$value]=substr($key,2);
}
}
return (isset(
$levels[$type]) ? $levels[$type] : "Error #{$type}");
}
echo
friendly_error_type(1); #ERROR
echo friendly_error_type(2); #WARNING
echo friendly_error_type(3); #Error #3
?>
在 5.6.12 和 7.0.3 上测试(第一个是意外的,没有意识到我被 ssh 到生产环境中:3)
匿名
11 年前
这将提供你配置的所有报告的异常列表。

<?php
function FriendlyErrorType($type)
{
$return ="";
if(
$type & E_ERROR) // 1 //
$return.='& E_ERROR ';
if(
$type & E_WARNING) // 2 //
$return.='& E_WARNING ';
if(
$type & E_PARSE) // 4 //
$return.='& E_PARSE ';
if(
$type & E_NOTICE) // 8 //
$return.='& E_NOTICE ';
if(
$type & E_CORE_ERROR) // 16 //
$return.='& E_CORE_ERROR ';
if(
$type & E_CORE_WARNING) // 32 //
$return.='& E_CORE_WARNING ';
if(
$type & E_COMPILE_ERROR) // 64 //
$return.='& E_COMPILE_ERROR ';
if(
$type & E_COMPILE_WARNING) // 128 //
$return.='& E_COMPILE_WARNING ';
if(
$type & E_USER_ERROR) // 256 //
$return.='& E_USER_ERROR ';
if(
$type & E_USER_WARNING) // 512 //
$return.='& E_USER_WARNING ';
if(
$type & E_USER_NOTICE) // 1024 //
$return.='& E_USER_NOTICE ';
if(
$type & E_STRICT) // 2048 //
$return.='& E_STRICT ';
if(
$type & E_RECOVERABLE_ERROR) // 4096 //
$return.='& E_RECOVERABLE_ERROR ';
if(
$type & E_DEPRECATED) // 8192 //
$return.='& E_DEPRECATED ';
if(
$type & E_USER_DEPRECATED) // 16384 //
$return.='& E_USER_DEPRECATED ';
return
substr($return,2);
}
echo
"error_reporting = " . FriendlyErrorType(ini_get('error_reporting')) .";<br>";
?>
ilpaijin at gmail dot com
7 年前
在 PHP 5.6.x 版本中,相对于常量 E_ALL 的位掩码值为 30719。
Herbert
8 年前
如果你想将此列表还原为错误/警告/通知/全部类别

<?php

$error_level
= 'warning'; // 允许的值:error/warning/notice/all

$error_error = (int) E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE;
$error_warning = (int) $error_error | E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING;
$error_notice = (int) $error_warning | E_NOTICE | E_USER_NOTICE | E_DEPRECATED | E_USER_DEPRECATED;
$error_all = (int) $error_notice | E_STRICT;

error_reporting ($GLOBALS["error_$error_level"]);

?>
espertalhao04 at hotmail dot com
7 年前
一种简化的方式来编写一个函数,以返回错误代码的(非最佳)位字符串表示形式。

<?php
function readable_error_type($error_code)
{
$constants = array();
foreach(
get_defined_constants() as $key => $value)
{
if(
strpos($key, 'E_') === 0 && ($value <= $error_code) && ($value & $error_code))
{
$constants[] = $key;
}
}

return
implode(' | ', $constants);
}
?>

这仅适用于大于 0 的值。
chris-php at IGNORETHISPART dot cybermato dot com
9 年前
怎么样?与下面的示例不同,它将显示所有设置的位,并处理将来定义的任何位(至少不会静默隐藏它们)...

$strErrorType = "";
$bit = 1;
$tmpErrNo = $errNo;
while ($tmpErrNo) {
if ($tmpErrNo & $bit) {
if ($strErrorType != "")
$strErrorType .= " | ";
switch ($bit) {
case E_USER_WARNING
$strErrorType .= "E_USER_WARNING"; break;
case E_USER_NOTICE
$strErrorType .= "E_USER_NOTICE"; break;
case E_WARNING
$strErrorType .= "E_WARNING"; break;
case E_CORE_WARNING
$strErrorType .= "E_CORE_WARNING"; break;
case E_COMPILE_WARNING
$strErrorType .= "E_COMPILE_WARNING"; break;
case E_NOTICE
$strErrorType .= "E_NOTICE"; break;
case E_ERROR
$strErrorType .= "E_ERROR"; break;
case E_PARSE
$strErrorType .= "E_PARSE"; break;
case E_CORE_ERROR
$strErrorType .= "E_CORE_ERROR"; break;
case E_COMPILE_ERROR
$strErrorType .= "E_COMPILE_ERROR"; break;
case E_USER_ERROR
$strErrorType .= "E_USER_ERROR"; break;
default
$strErrorType .= "(未知错误位 $bit)"; break;
}
}
$tmpErrNo &= ~$bit;
$bit <<= 1;
}
To Top