PHP中strtolower接收数组触发警告的问题排查与解决
问题原因分析
你遇到的警告strtolower() expects parameter 1 to be string, array given,核心原因是**get_headers($url, 1)返回的Content-Type可能是数组类型**。
当你给get_headers的第二个参数传1时,函数会返回关联数组,若目标URL存在重定向(比如HTTP 301/302跳转),Content-Type会被存储为数组,包含每一次跳转响应的Content-Type值。这时候你直接取$url_headers['Content-Type'],拿到的就不是字符串,而是数组,传给strtolower自然就触发类型错误警告。
解决办法
我们需要先处理Content-Type可能为数组的情况,同时优化函数的健壮性,以下是修正后的代码:
function isImage($url){ $url_headers = get_headers($url, 1); if(!isset($url_headers['Content-Type'])){ return false; // 没有Content-Type直接返回非图片 } // 处理Content-Type是数组的情况(重定向场景),取最后一次响应的类型 $type = $url_headers['Content-Type']; if(is_array($type)){ $type = end($type); // 获取数组最后一个元素,即最终响应的Content-Type } $type = strtolower($type); // 用更简洁的方式定义有效图片类型 $valid_image_types = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp']; return in_array($type, $valid_image_types); }
关键优化点:
- 处理数组类型的Content-Type:用
is_array()判断,若为数组则取最后一个元素(因为最后一次响应的Content-Type才是目标资源的真实类型)。 - 完善边界判断:增加
!isset($url_headers['Content-Type'])的判断,避免无头部时的逻辑漏洞。 - 简化有效类型判断:用
in_array替代关联数组查找,更直观易维护,同时补充了常见的图片类型(比如webp、gif)。 - 确保函数总有返回值:原函数在某些分支下没有返回值,修正后所有路径都会返回布尔值,符合PHP函数的规范。
调用代码可以保持不变:
if(isImage($matches[0])){ // do something }
内容的提问来源于stack exchange,提问作者RGS
相关产品推荐
相关产品推荐

