
php 8.1 起,`explode()`、`strlen()` 等内置函数将 `null` 视为非法参数并触发弃用警告。解决方法是使用空合并操作符(`??`)提供默认空字符串,确保类型安全且逻辑不变。
在 PHP 8.1 及更高版本中,许多原本接受 null 的内部函数(如 explode()、strlen()、trim()、strpos() 等)已明确要求其字符串参数为非空类型(string),向其传递 null 将触发 Deprecated 级别警告:
PHP Deprecated: explode(): Passing null to parameter #2 ($string) of type string is deprecated
这源于 PHP 8.1 对内部函数签名的严格化——所有标量类型声明现在强制执行,null 不再被隐式转换为空字符串。
✅ 推荐解决方案:使用空合并操作符 ??
// ❌ 错误:可能传入 null(如 $result['comp_uids'] 未设置或为 null)
$comp_uids = explode(',', $result['comp_uids']);
// ✅ 正确:显式提供默认值,确保始终传入 string
$comp_uids = explode(',', $result['comp_uids'] ?? '');该写法等价于:
立即学习“PHP免费学习笔记(深入)”;
$comp_uids = explode(',', isset($result['comp_uids']) ? $result['comp_uids'] : '');但更简洁、可读性更强,且能同时处理 null、未定义键(undefined index)和 false(仅当 ?? 左侧为 null 时才生效,不影响布尔 false 或空字符串)。
? 其他常见函数的兼容写法示例:
// strlen() $len = strlen($input ?? ''); // trim() $trimmed = trim($input ?? ''); // strpos() $pos = strpos($haystack ?? '', $needle ?? ''); // substr() $part = substr($str ?? '', 0, 10);
⚠️ 注意事项:
- ?? 仅对 null 和未定义变量/键生效;若 $result['comp_uids'] 是 false 或 0,它仍会被原样传入(这是预期行为);
- 若业务逻辑需区分 null、空字符串 '' 和 '0',请改用显式判断(如 is_string($result['comp_uids']) ? ... : []);
- 建议配合静态分析工具(如 PHPStan)或 IDE 类型提示,提前识别潜在 null 流入点;
- 在升级到 PHP 8.1+ 前,应全局搜索 explode(、strlen( 等调用,批量修复参数来源。
? 总结:PHP 8.1 的这一变更提升了类型安全性与代码健壮性。通过 ?? '' 统一兜底,既消除弃用警告,又保持向后兼容,是迁移中最轻量、最推荐的实践方式。











