为何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
相关产品推荐
相关产品推荐

