43、PHP 8.4 中弃用 - CSV:必须提供 $escape 参数

作者: 温新

图书: 【PHP 8.4 新特性】

阅读: 137

时间: 2025-01-18 11:58:29

PHP 提供了内置的 CSV 功能,允许读取和写入 CSV 文件。然而,这个实现存在一些问题,特别是在转义行为方面,这些问题正在逐渐淘汰。

CSV 功能使用三个字符来分隔(默认是,)、包围(默认是")和转义(当前默认是\)。通常情况下,如果包围字符出现在数据字段中,它会通过将其加倍来转义。然而,PHP 的实现允许通过指定转义字符来定制转义行为。

当转义字符被设置为除空字符串或包围字符本身以外的任何值时,会导致不符合规范的行为,数据无法在读写的循环过程中生存下来,例如:fgetcsv -> fputcsv -> fgetcsv

以下函数和方法受到影响:

  • fputcsv
  • fgetcsv
  • str_getcsv
  • SplFileObject::setCsvControl
  • SplFileObject::getCsvControl
  • SplFileObject::fputcsv
  • SplFileObject::fgetcsv

以上所有函数/方法的默认 $escape 参数值为 \"

逐步淘汰转义机制

PHP 8.4 弃用了不传递 $escape 参数的做法,PHP 9.0 计划完全移除 $escape 参数。

这意味着,如果未通过位置参数或命名参数传递 $escape 参数,上述所有函数/方法的调用将会发出弃用通知。

例如,str_getcsv 函数具有以下签名:

str_getcsv(string $string, string $separator = ',', string $enclosure = '"', string $escape = '\\'): array

在 PHP 8.4 及以后的版本中,使用上述所有函数时,如果不传递 $escape 参数,会触发弃用通知:

str_getcsv($string, separator: ',', enclosure: '"');

弃用通知:

str_getcsv(): the $escape parameter must be provided as its default value will change ...

为了避免弃用通知,应该显式传递 $escape 参数:

str_getcsv($string, separator: ',', enclosure: '"');
str_getcsv($string, separator: ',', enclosure: '"', escape: "");

建议使用空字符串 "" 作为转义字符。这样可以有效禁用转义机制,如果在字段数据中遇到包围字符,PHP 会通过将包围字符加倍来转义它。

向后兼容性影响

在 PHP 8.4 中,如果没有传递 $escape 参数,会触发弃用通知。显式传递 $escape 参数可以避免弃用通知。

PHP 9.0 计划完全移除 $escape 参数,并始终通过将包围字符加倍来转义它。

请登录后再评论