升级Php 7.4带来的两个大坑

升级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 或其他新版本时,需要注意版本升级可能会带来的变化和问题,并及时检查代码。每个版本的新特性都需要我们深入理解,以便我们能够充分发挥它们的优势。

后端开发标签