升级Php 7.4带来的两个大坑
升级 Php 7.4 看似十分平凡,但如果你没有注意一些坑点就可能会面临无法调试的问题,本文总结了两个大坑和解决方法,帮助你避免更多的烦恼。
## 1. 框架使用 addcslashes 导致反斜杠被转义
在 PHP 7.4 中有个新的特性,增加了遇到不合法的 `\u` 符号时会抛出一个警告,这个特性导致了一些框架中用到的 `Symfony VarExporter` 在将数组导出时达不到预期的效果。经过分析发现是 `addcslashes` 函数把 `\` 转义成 `\\`,导致最终输出的字符串不符合预期。
解决方法:在 `Symfony VarExporter` 的代码中去掉 `addcslashes` 函数即可,将代码:
```
if (preg_match('/[^\x20-\x7e]/', $value)) {
return '"' . addcslashes($value, "\000..\037\\'\"\177..\377") . '"';
}
return '"' . addcslashes($value, '\\"') . '"';
```
替换为:
```
return var_export($value, true);
```
## 2. PDO 在错误情况下返回空数组
在以往的版本中,当 `PDOStatement::execute()` 函数执行失败时,`PDO::ERR` 会抛出异常并且在错误情况下返回一个空数组。但是在 PHP 7.4 中,PDO 函数在错误情况下返回 `FALSE`,而不是一个空数组,这一改变导致在之前使用 PDO 进行错误处理的代码出现问题。
解决方法:使用 `PDOStatement::errorInfo()` 获取错误信息,例如:
```
$stmt = $pdo->prepare("SELECT * FROM test WHERE id=:id");
$result = $stmt->execute([':id' => 1]);
if (!$result) {
$error = $stmt->errorInfo();
echo "Database error: " . $error[2];
} else {
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($data);
}
?>
```
在检查 `$result` 返回值时,可以使用 `$stmt->errorInfo()` 函数来获取错误信息并进行处理,再次实现正确的错误处理。
总结:当我们升级到 PHP 7.4 或其他新版本时,需要注意版本升级可能会带来的变化和问题,并及时检查代码。每个版本的新特性都需要我们深入理解,以便我们能够充分发挥它们的优势。