PHP 8.6:array_filter 函数的 $mode 参数在接收无效值时将抛出 ValueError
PHP 中的 array_filter 函数利用回调函数对数组进行过滤。它支持一个可选的 $mode 参数,该参数接受一个整数值,用于指定应将数组的键、值,或两者同时传递给回调函数。
array_filter(array $array, ?callable $callback = null, int $mode = 0): array$mode 参数仅接受以下三个值:
- 0(默认值):将数组值作为唯一的参数传递给
$callback。 ARRAY_FILTER_USE_BOTH(赋值为 1):将数组值和键都传递给$callback。ARRAY_FILTER_USE_KEY(赋值为 2):将数组键传递给$callback。
新增 ARRAY_FILTER_USE_VALUE 常量
鉴于 array_filter 函数的默认值(0)此前并未被定义为 PHP 常量,PHP 8.6 版本声明了一个名为 ARRAY_FILTER_USE_VALUE 的新全局常量。该常量被赋值为 0,这与 $mode 参数的默认值完全一致。
const ARRAY_FILTER_USE_VALUE = 0;传入无法识别的 $mode 会抛出 ValueError
在 PHP 8.6 及更高版本中,如果传入除 ARRAY_FILTER_USE_VALUE (0)、ARRAY_FILTER_USE_BOTH (1) 或 ARRAY_FILTER_USE_KEY (2) 以外的值,将会抛出 ValueError 异常。
array_filter([], fn() => true, 3);ValueError: array_filter(): Argument #3 ($mode) must be one of ARRAY_FILTER_USE_VALUE, ARRAY_FILTER_USE_KEY, or ARRAY_FILTER_USE_BOTH.向后兼容性影响
在 PHP 8.6 之前的版本中,如果将无法识别的值传递给 array_filter 函数的 $mode 参数,该参数将被静默忽略,函数的行为如同 $mode = 0 一样。
在 PHP 8.6 及更高版本中,传递无效值会抛出 ValueError 异常。
ARRAY_FILTER_USE_VALUE 常量是新增的,但可以轻松地在旧版本的 PHP 上实现兼容:
if (!defined('ARRAY_FILTER_USE_VALUE')) {
define('ARRAY_FILTER_USE_VALUE', 0);
}