升级PHP 8.0遇数组偏移访问警告,求兼容修复方案
PHP 8.0兼容修复:解决"Trying to access array offset on value of type bool"警告
错误原因
PHP 8.0及以上版本对类型检查更严格,当尝试对布尔值(bool类型)进行数组偏移访问时,会直接抛出警告;而PHP 7.4及更早版本会静默跳过这个错误。
你的代码中,当wpsc_update_meta_cache函数执行失败(比如未找到对应元数据、查询出错)时,会返回false,此时直接执行$meta_value = $meta_values[ $meta_tuple['object_id'] ];就会触发警告。
修复方案
在访问数组偏移量之前,先检查wpsc_update_meta_cache的返回值是否为有效数组,若无效则初始化空数组兜底,确保后续代码不会因类型错误抛出警告。
修改后的完整代码:
function wpsc_get_meta( $meta_key, $object_type, $object_id = 0 ) { global $wpdb; $cache_object_id = $object_id = (int) $object_id; $meta_key = wpsc_sanitize_meta_key( $meta_key ); $meta_tuple = compact( 'object_type', 'object_id', 'meta_key' ); $meta_tuple = apply_filters( 'wpsc_get_meta', $meta_tuple ); // Get cached meta $meta_value = wp_cache_get( $cache_object_id, $meta_tuple['object_type'] ); // If not cached, get and cache all object meta if ( $meta_value === false ) { $meta_values = wpsc_update_meta_cache( $meta_tuple['object_type'], $meta_tuple['object_id'] ); // 修复:先检查$meta_values是否为有效数组,避免对bool值做数组操作 if ( !is_array( $meta_values ) ) { $meta_value = []; } else { // 同时检查目标key是否存在,避免未定义索引警告 $meta_value = isset( $meta_values[ $meta_tuple['object_id'] ] ) ? $meta_values[ $meta_tuple['object_id'] ] : []; } } if ( isset( $meta_value[ $meta_tuple['meta_key'] ] ) ) { return maybe_unserialize( $meta_value[ $meta_tuple['meta_key'] ] ); } return ''; }
额外说明
- 新增的
is_array($meta_values)检查确保我们只对数组类型进行偏移访问 - 同时增加
isset( $meta_values[ $meta_tuple['object_id'] ] )检查,避免出现"Undefined array key"的额外警告 - 兜底的空数组
[]保证后续代码中$meta_value始终是数组类型,符合后续isset( $meta_value[ $meta_tuple['meta_key'] ] )的检查逻辑
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

