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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:20:26