is_array()是php判断原生数组最直接的函数,但存在四大坑:不识别arrayobject等数组式对象;对null虽安全但需前置防护避免后续count/foreach报错;无法区分空数组与非数组;在严格类型环境中忽略?array声明易致致命错误。

is_array() 是 PHP 判断变量是否为原生数组最常用、最直接的函数,但它在实际使用中确实存在几个容易被忽略的“坑”,稍不注意就会导致逻辑错误或运行警告。
误把 ArrayObject 或其他数组式对象当数组
is_array() 只认 PHP 原生数组([] 或 array()),对实现了 ArrayAccess、Traversable 或 Countable 的对象(如 ArrayObject、Doctrine\Common\Collections\ArrayCollection)一律返回 false。
- 即使你用
foreach能正常遍历它,is_array($obj)仍是false - 若业务逻辑依赖“能像数组一样用”,仅靠 is_array 就会漏判
- 需要兼容时,应组合判断:
is_array($var) || ($var instanceof ArrayAccess)
未处理 null 或未定义变量就直接调用
is_array() 本身对 null、undefined、string、int 等都安全,返回 false,不会报错。但开发者常犯的错是:在没确认变量存在的情况下,就把它传给其他函数(比如 count()、foreach),而这些函数遇到 null 会直接报错。
- 例如:
foreach($data as $v)中 $data 是null→ Invalid argument supplied for foreach() - 正确做法是先
is_array($data),再进入遍历或计数逻辑 - 尤其在 API 返回、数据库查询结果可能为
null的场景,必须加这层防护
混淆“是否为数组”和“是否为空数组”
is_array() 只回答「类型是不是 array」,不回答「里面有没有元素」。很多人误以为 !is_array($var) 就等于「没数据」,或者反过来,看到 is_array($var) === true 就直接 foreach,结果遍历空数组虽不报错,但逻辑可能缺失默认行为。
- 空数组
[]→is_array()返回true,但count($var) === 0 - 想判断“有无有效数据”,不能只靠 is_array;需组合
is_array($var) && count($var) > 0 - 若还需过滤假值(如
0、false、''),则要用array_filter($var)再判断长度
在严格类型环境中忽略可为空数组声明
PHP 7.1+ 支持 nullable 类型(?array),但很多老代码或接口文档没明确标注返回值是否可空。开发者按习惯写 function process(array $data),结果传入 null 就触发致命错误 Argument 1 passed to process() must be of the type array, null given。
- 函数参数应优先声明为
?array $data,并在内部用is_array($data)分支处理 - 返回值也建议用
?array明确语义,避免调用方盲目信任 - 静态分析工具(如 PHPStan)会据此提示潜在空值风险,提前拦截问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











