You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何PHP的array_filter会忽略strict_types严格类型模式?

为什么array_filter会忽略strict_types=1?

declare(strict_types=1)的严格类型检查只对用户代码中显式发起的函数调用生效,而array_filter这类PHP内置函数在调用回调时,属于内部隐式调用,不会触发严格类型检查规则。

对应你的现象拆解:

  • 字符串"1"能被PHP安全转换为整数1,在内置函数调用回调前,PHP会自动完成软类型转换,因此不会触发TypeError。
  • 字符串"2 strings"无法转换为有效的整数,此时类型转换失败,才会抛出TypeError。

关键区别验证:

如果是你直接显式调用回调函数,严格模式会立刻报错:

declare(strict_types=1);

function filterInt(int $val): bool {
    return $val > 0;
}

// 直接触发TypeError,严格模式不允许字符串转int
filterInt("1");

但通过array_filter调用时,会走PHP内部的参数处理逻辑,绕过严格类型检查:

declare(strict_types=1);

function filterInt(int $val): bool {
    return $val > 0;
}

// "1"被自动转为int 1,不会报错;"2 strings"转换失败抛出错误
$arr = array_filter(["1", "2 strings"], "filterInt");

本质上,strict_types的约束范围不包含内置函数对回调的隐式调用,这类场景下PHP会沿用默认的类型转换规则。

内容的提问来源于stack exchange,提问作者hanshenrik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:32:13