php 8 移除了 mysql_escapestring() 等函数,收紧 strpos() 等函数类型校验,要求统一使用 mb* 函数、declare(strict_types=1) 和 utf-8 编码配置以确保字符串处理安全可靠。

PHP 5 到 PHP 8 的字符串函数变化不小,但多数不是“直接删除”,而是弃用、行为调整或类型更严格。迁移时重点不是重写所有字符串逻辑,而是识别高风险函数和隐式转换场景。
已移除或废弃的字符串函数
这些函数在 PHP 8.0 中被彻底移除(不再可用),若代码中仍在调用,会触发 Fatal error:
-
mysql_escape_string()—— 早在 PHP 7.0 就废弃,PHP 8.0 彻底删除(注意:它不属于 MySQLi 或 PDO,且不依赖连接) -
setlocale(LC_CTYPE, ...)配合strtoupper()/strtolower()处理非 ASCII 字符的行为已不可靠;PHP 8 强制要求使用mb_strtoupper()等多字节函数替代 -
split()、spliti()、sql_regcase()等基于 POSIX 正则的函数,早在 PHP 5.3 就废弃,PHP 7.0 删除,PHP 8 不再提及
行为变更的关键函数
函数名没变,但参数校验、返回值或编码处理逻辑收紧,容易引发静默错误或 Warning:
-
strpos()、strrpos()、stripos():PHP 8 开始对非字符串$haystack或$needle报TypeError(PHP 7 仅发E_WARNING并尝试转换) -
strcmp()、strncmp():PHP 8 要求两个参数都为 string,传 int 或 null 会抛 TypeError;PHP 7 会静默转成字符串(如null → "") -
str_replace():当$subject为null时,PHP 8 返回""(明确空字符串),PHP 7 返回null;需检查返回值类型是否被强依赖
推荐迁移配置模板(php.ini / runtime 兼容层)
不建议靠 ini 关闭报错来掩盖问题,但可阶段性启用严格模式辅助检测:
- 开发环境开启:
error_reporting = E_ALL | E_STRICT+display_errors = On - 添加运行时兼容垫片(放在入口文件顶部):
// 兼容 PHP 5 风格的弱类型字符串操作(谨慎使用,仅过渡期)
if (!function_exists('safe_strpos')) {
function safe_strpos($haystack, $needle, $offset = 0) {
$haystack = (string)$haystack;
$needle = (string)$needle;
return strpos($haystack, $needle, $offset);
}
}
更可持续的做法是统一替换为 mb_* 函数并声明 declare(strict_types=1);,配合静态分析工具(如 PHPStan)扫描字符串类型流。
编码与区域设置注意事项
PHP 8 默认不再受 setlocale() 影响大小写转换和排序:
- 改用
mb_strtoupper($s, 'UTF-8')替代strtoupper($s)(尤其含中文、德语 ß、土耳其语 İ 等) - 字符串比较优先用
mb_strcmp()或 ICU 扩展的collator_compare(),避免strcmp()的 locale 依赖陷阱 - 确保脚本开头有
mb_internal_encoding('UTF-8');,并在 php.ini 中设default_charset = "UTF-8"
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











