43、PHP 8.4 中弃用 - CSV:必须提供 $escape 参数
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
参数,并始终通过将包围字符加倍来转义它。
请登录后再评论