PHP 错误分类
1. 致命错误(Fatal Errors)
特性:
- 代码执行立即终止。
- 无法通过
set_error_handler()
处理,需使用register_shutdown_function()
处理。 - 典型错误包括:
E_ERROR
(运行时致命错误)E_PARSE
(解析错误)E_COMPILE_ERROR
(编译时致命错误)E_CORE_ERROR
(PHP 核心致命错误)
示例:
// E_ERROR:调用未定义函数
undefined_function();
// E_PARSE:语法错误
eval(“echo ‘hello’; missing_semicolon”);
2. 警告(Warnings)
特性:
- 仅提示,不影响程序继续执行。
- 可通过
set_error_handler()
处理。 - 典型错误包括:
E_WARNING
(运行时警告)E_COMPILE_WARNING
(编译时警告)E_CORE_WARNING
(PHP 核心警告)
示例:
// E_WARNING:包含不存在的文件
include ‘non_existing_file.php’;
3. 通知(Notices)
特性:
- 仅提示,代码继续执行。
- 适用于潜在的错误。
- 典型错误:
E_NOTICE
(运行时通知)
示例:
// E_NOTICE:未定义变量
echo $undefined_variable;
4. 用户级错误
特性:
- 由
trigger_error()
触发。 - 适用于自定义错误处理。
- 包括:
E_USER_ERROR
(用户致命错误)E_USER_WARNING
(用户警告)E_USER_NOTICE
(用户通知)
示例:
// 触发 E_USER_WARNING
trigger_error(“自定义警告”, E_USER_WARNING);
5. 可恢复错误(Recoverable Errors)
特性:
E_RECOVERABLE_ERROR
- 类似于
E_ERROR
,但可以通过set_error_handler()
处理,不会终止执行。
示例:
// E_RECOVERABLE_ERROR: 不兼容的参数类型
function test(int $a) {}
test(“string”);
6. 严格模式(Strict Standards)
特性:
E_STRICT
- 提示不符合 PHP 未来版本的代码风格(PHP 7.0+ 被弃用)。
7. 弃用警告(Deprecation Warnings)
特性:
E_DEPRECATED
(已弃用)E_USER_DEPRECATED
(用户弃用)- 表示某个函数或特性将在未来版本被删除。
示例:
// E_DEPRECATED:弃用函数
create_function(‘$a’, ‘return $a * 2;’);
完整错误等级表
错误类型 | 常量 | 说明 |
---|---|---|
致命错误 | E_ERROR |
运行时致命错误,终止执行 |
解析错误 | E_PARSE |
语法错误,代码无法执行 |
编译错误 | E_COMPILE_ERROR |
编译阶段致命错误 |
核心错误 | E_CORE_ERROR |
PHP 启动时发生的致命错误 |
可恢复错误 | E_RECOVERABLE_ERROR |
可通过 set_error_handler() 处理的致命错误 |
警告 | E_WARNING |
运行时警告,不影响程序执行 |
编译警告 | E_COMPILE_WARNING |
编译阶段警告 |
核心警告 | E_CORE_WARNING |
PHP 启动时的警告 |
通知 | E_NOTICE |
运行时通知 |
用户自定义错误 | E_USER_ERROR |
用户触发的致命错误 |
用户自定义警告 | E_USER_WARNING |
用户触发的警告 |
用户自定义通知 | E_USER_NOTICE |
用户触发的通知 |
严格模式 | E_STRICT |
强制 PHP 遵循更严格的代码标准(已弃用) |
弃用警告 | E_DEPRECATED |
运行时弃用警告 |
用户自定义弃用警告 | E_USER_DEPRECATED |
用户触发的弃用警告 |
如何捕获错误?
捕获所有错误
可以使用 error_reporting(E_ALL);
让 PHP 显示所有错误:
error_reporting(E_ALL);
ini_set(‘display_errors’, 1);
捕获致命错误
可以使用 register_shutdown_function()
function shutdownHandler() {
$error = error_get_last();
if ($error) {
echo “捕获到致命错误: ” . $error[‘message’];
}
}
register_shutdown_function(“shutdownHandler”);