php7起each()被移除,须改用foreach;字符串下标需显式转整型;pow()负底数非整指数返回nan;abs()/round()禁传字符串数字;位运算需强制转int;mysql扩展彻底移除,必须改用mysqli/pdo。

each() 被删了,foreach 是唯一安全选择
PHP7.0 起 each() 函数被彻底移除,任何残留的 while ($item = each($arr)) 会直接报 Fatal error: Uncaught Error: Call to undefined function each()。这不是警告,是中断执行。
- 立刻替换为
foreach ($arr as $k => $v),这是最简、最稳、性能也最好的方案 - 若逻辑强依赖数组内部指针(比如分批处理大数组),改用
array_keys($arr)预取键列表,再配合for循环 +$arr[$keys[$i]]访问,避免指针状态不可控 - 禁用
reset()/end()在稀疏数组上反复调用——PHP7 的哈希表重排开销变大,key($arr)和key(array_slice($arr, -1, 1, true))更轻量
字符串下标访问必须是整数,否则 TypeError
PHP7.4 开始,$str['0'] 或 $str[$index](当 $index 是字符串)会抛出 TypeError,不再是静默转为 0。常见于从 URL 参数或 JSON 解析来的索引字段。
- 显式转整型:
$str[(int)$index],别信隐式转换 - 校验动态索引:
filter_var($index, FILTER_VALIDATE_INT) !== false,不通过就提前 throwInvalidArgumentException - 批量切片别用
substr($str, $start, $len)接非整参数;统一用mb_substr($str, (int)$start, (int)$len, '8bit'),防止字节越界或乱码
pow(-2, 0.5) 这类调用在 PHP7 直接返回 NAN
PHP7 启用 IEEE 754 严格浮点校验,pow() 对负底数 + 非整指数不再尝试近似,而是返回 NAN,下游 is_numeric() 或 floatval() 可能悄悄失效,导致逻辑跳变。
- 科学计算路径中,把
pow($x, 0.5)换成sqrt(abs($x)) * ($x >= 0 ? 1 : NAN),或引入gmp_sqrt()做整数开方 -
abs()、round()等函数禁止传字符串数字如'123.45',否则触发E_WARNING并强制转 float——先is_numeric($val) && is_float($val) || is_int($val)校验类型 - 位运算如
$a & $b,务必前置(int)$a & (int)$b,PHP7 不再帮你截断,而是直接按 double 位模式算,结果不可预期
MySQL 扩展已死,mysqli/pdo 不只是推荐,是硬性要求
mysql_connect() 等函数在 PHP7.0 中已被完全移除,不是弃用(E_DEPRECATED),是彻底不存在。线上环境若还留着这类代码,启动即 fatal。
立即学习“PHP免费学习笔记(深入)”;
- 必须重写所有数据库交互:用
mysqli(面向对象风格更稳)或PDO,注意mysql_fetch_array()→$result->fetch_assoc(),mysql_query()→$conn->query() - 检查第三方库是否还在用
mysql_*—— 尤其是老 CMS 插件、支付 SDK、日志组件,很多没更新;找不到维护者就 fork 改,别指望“还能跑” - 连接失败错误不再静默返回
false,而是抛mysqli_sql_exception或PDOException,需用try/catch包裹,不能只靠or die()
实际升级中最容易漏的是配置文件里隐藏的 mysql_* 函数调用,和模板层中混写的 echo $row['col'] ?>(当 $row 来自旧扩展且未初始化时,PHP7 会报未定义索引而非空值)。这些地方不跑全链路测试根本发现不了。











