PHP 8.5:弃用在用户输出 handler 中返回非字符串值
PHP 提供了一系列 ob_*
函数,允许运行嵌套输出缓冲区、显式刷新缓冲区和设置自定义输出缓冲区处理器(handler)。
当设置自定义输出缓冲区处理程序时,该函数将被调用。你可以进一步处理缓冲区内容,或将缓冲区内容传递到其他地方。例如,自定义输出缓冲区处理程序可以重写打印调用写入的内容,压缩它们,将它们写入文件等。
输出缓冲是 PHP 中长期存在的一项功能,早于严格类型和标量类型。自定义输出缓冲区的返回值被强制转换为字符串,除非返回值是数组或 false
。
- 数组返回值转换为字符串形式的数组。
- 对于
false
返回值,它会为输出处理程序设置PHP_OUTPUT_HANDLER_DISABLED
位。 - 对于返回值
true
,它将转换成空字符串。
在 PHP 8.4 的开发周期中,有人建议弃用这种强制行为,并在自定义输出缓冲区函数返回非字符串值时发出弃用通知。它没有在 PHP 8.4 中实现,但在 PHP 8.5 及更高版本中实现了。ob_start()
函数的文档中设置了自定义输出缓冲区,指示该函数的返回值必须是字符串。这种弃用进一步强化了这一点。
ob_start(
static function(string $buffer, int $phase): string {
return (str_replace("hunter2", "****", $buffer));
}
);
echo "hunter2 test";
在 PHP 8.5 及之后版本中,如果输出缓冲处理器没有返回 string
值,PHP 将发出弃用通知:
ob_start(
static function(string $buffer, int $phase) {
return [];
}
);
echo "hunter2 test";
Deprecated: Returning a non-string result from user output handler {closure:...} is deprecated in ... on line ...
建议的替代方案
ob_start()
函数的 $callback
参数需要一个返回 string
的 callable
。为避免弃用通知,请确保返回字符串。
如果输出已经处理,Handler 可以返回空字符串。
ob_start(
static function(string $buffer, int $phase) {
+ return '';
}
);
向后兼容性影响
在 PHP 8.5 及之后版本中,未返回字符串的自定义输出缓冲区 handler 将会发出弃用通知。在 PHP 9.0 及之后的版本,可能会出现异常。
返回处理过的字符串,或者返回空字符串,是跨版本兼容的修改方式。