PHP Conference Japan 2024

预定义常量

以下常量始终作为 PHP 核心的一部分可用。

以下常量(对应数值或符号名称)用作位掩码,以指定要报告的错误。可以使用 位运算符 来组合这些值或屏蔽某些类型的错误。

提示

常量的名称可以在 php.ini 中使用,而不是它们对应的原始数值。但是,在 php.ini 中仅理解 |~^!& 运算符。

警告

无法在 PHP 外部使用符号名称。例如,在 httpd.conf 中,必须使用计算出的位掩码值。

E_ERROR (int)
严重运行时错误。这些表示无法恢复的错误,例如内存分配问题。脚本执行将停止。 常量的值:1
E_WARNING (int)
运行时警告(非致命错误)。脚本执行不会停止。 常量的值:2
E_PARSE (int)
编译时解析错误。解析错误应该只由解析器生成。 常量的值:4
E_NOTICE (int)
运行时通知。指示脚本遇到了一些可能表示错误但也有可能在脚本正常运行过程中发生的事情。 常量的值:8
E_CORE_ERROR (int)
PHP 初始启动期间发生的严重错误。这类似于 E_ERROR,只是它由 PHP 核心生成。 常量的值:16
E_CORE_WARNING (int)
PHP 初始启动期间发生的警告(非致命错误)。这类似于 E_WARNING,只是它由 PHP 核心生成。 常量的值:32
E_COMPILE_ERROR (int)
严重的编译时错误。这类似于 E_ERROR,只是它由 Zend 脚本引擎生成。 常量的值:64
E_COMPILE_WARNING (int)
编译时警告(非致命错误)。这类似于 E_WARNING,只是它由 Zend 脚本引擎生成。 常量的值:128
E_DEPRECATED (int)
运行时弃用通知。启用此选项以接收有关将来版本中将无法使用的代码的警告。 常量的值:8192
E_USER_ERROR (int)
用户生成的错误消息。这类似于 E_ERROR,只是它是在 PHP 代码中通过使用 PHP 函数 trigger_error() 生成的。 常量的值:256
警告

从 PHP 8.4.0 开始,不建议将此常量与 trigger_error() 一起使用。建议改为 throw 一个 Exception 或调用 exit()

E_USER_WARNING (int)
用户生成的警告消息。这类似于 E_WARNING,只是它是在 PHP 代码中通过使用 PHP 函数 trigger_error() 生成的。 常量的值:512
E_USER_NOTICE (int)
用户生成的通知消息。这类似于 E_NOTICE,只是它是在 PHP 代码中通过使用 PHP 函数 trigger_error() 生成的。 常量的值:1024
E_USER_DEPRECATED (int)
用户生成的弃用消息。这类似于 E_DEPRECATED,只是它是在 PHP 代码中通过使用 PHP 函数 trigger_error() 生成的。 常量的值:16384
E_STRICT (int)
PHP 发出的关于已执行代码的运行时建议,以确保向前兼容性。 常量的值:2048
警告

此错误级别未使用,并且从 PHP 8.4.0 开始已弃用。

E_RECOVERABLE_ERROR (int)
对应于可捕获致命错误的旧版引擎“异常”。类似于 Error,但必须通过用户定义的错误处理程序(参见 set_error_handler())捕获。如果未处理,则其行为类似于 E_ERROR 常量的值:4096

注意: 此错误级别实际上未使用,发生这种情况的唯一情况是在将 object 作为 bool 失败时。这只能发生在内部对象上。 在 PHP 8.4.0 之前,最常见的示例是在条件语句中使用 GMP 实例。

E_ALL (int)
包含所有错误、警告和提示的位掩码。 常量的值:32767
添加注释

用户贡献的注释 8 条注释

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

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

但是设置未定义的位可能会导致未定义的行为,这意味着 *任何事情* 都可能发生 :-)
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
"";
}
?>
fadhilinjagi at gmail dot com
3 年前
一种简单而巧妙的方法,可以从错误代码中获取错误级别。您甚至可以进一步自定义错误级别名称。

<?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 更新错误级别名称时,需要更新此内容。否则,它可以正常工作。
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
7 年前
另一种获取所有设置为要报告的 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++;
}
?>
kezzyhko at NOSPAM dot semysha dot ru
8 年前
对我来说,通过 int 值获取错误名称的最佳方法是。并且它对我来说运行良好;)
<?php

array_flip
(array_slice(get_defined_constants(true)['Core'], 1, 15, true))[$type];

//可读性更好的相同代码
array_flip(
array_slice(
get_defined_constants(true)['Core'],
1,
15,
true
)
)[
$type]

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

function prettycode($code){
return $code == 0 ? "FATAL" : array_search($code, get_defined_constants(true)['Core']);
}
ErikBachmann
5 年前
<?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]
To Top