编程

PHP 8.5:弃用在用户输出 handler 中返回非字符串值

16 2025-08-15 09:47:00

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 参数需要一个返回 stringcallable。为避免弃用通知,请确保返回字符串。

如果输出已经处理,Handler 可以返回空字符串。

ob_start(
   static function(string $buffer, int $phase) {
+    return '';
   }
);

向后兼容性影响

在 PHP 8.5 及之后版本中,未返回字符串的自定义输出缓冲区 handler 将会发出弃用通知。在 PHP 9.0 及之后的版本,可能会出现异常。

返回处理过的字符串,或者返回空字符串,是跨版本兼容的修改方式。