升级 php 8 后,extract() 收到布尔值或其他非数组参数会抛出 typeerror。先查出配置加载为什么没有返回数组,再决定是报告加载失败还是使用明确的缺省配置。
确认传进 extract() 的类型
把下面代码保存为 extract-demo.php 并运行。用变量模拟配置加载失败返回 false。
<?php $settings = false;
try {
@extract($settings, EXTR_SKIP);
} catch (TypeError $error) {
echo get_class($error), PHP_EOL;
}

预期输出 TypeError。@ 不能捕获抛出的异常。实际排查时记录类型和配置加载位置,避免把配置内容或密码写入日志。
配置加载失败时直接报告原因
将下面函数放进应用的配置装配层。只读取明确需要的字段,并分别检查配置容器和字段的类型。
function readAppSettings($settings): array
{
if (!is_array($settings)) {
throw new RuntimeException('Application settings did not load');
}
$locale = $settings['locale'] ?? 'zh-CN';
$pageSize = $settings['page_size'] ?? 20;
if (!is_string($locale) || !is_int($pageSize) || $pageSize $locale, 'page_size' => $pageSize];
}

只有整个配置已经加载成功时,缺少可选字段才使用默认值。调用层应按项目的错误处理方式记录或处理异常。
分别验证缺省配置和非法类型
用空数组验证缺省行为,再用字符串页大小验证字段校验。
var_export(readAppSettings([]));
try {
readAppSettings(['page_size' => '20']);
} catch (InvalidArgumentException $error) {
echo PHP_EOL, $error->getMessage(), PHP_EOL;
}
空数组得到 zh-CN 和 20。字符串页大小触发字段异常。如果配置格式规定该字段是字符串,应在读取边界先验证并转换。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











