警告:升级到 PHP 8.0 时,尝试访问 bool 类型值的数组偏移量错误 [重复]

Warning: Trying to access array offset on value of type bool error when upgrading to PHP 8.0 [duplicate]

提问人:Andy 提问时间:12/20/2022 最后编辑:mickmackusaAndy 更新时间:12/20/2022 访问量:4814

问:

将我们的网站升级到 PHP 8.0 时,我们面临以下错误:

警告:尝试访问 bool 类型值的数组偏移量

这与以下代码行有关:

$meta_value = $meta_values[ $meta_tuple['object_id'] ];

整个函数的代码是:

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_value = $meta_values[ $meta_tuple['object_id'] ];
    }

    if ( isset( $meta_value[ $meta_tuple['meta_key'] ] ) ) {
        return maybe_unserialize( $meta_value[ $meta_tuple['meta_key'] ] );
    }

    return '';
}

有什么建议我们如何修复上述代码以实现 PHP 8.0 兼容性?

回滚到 PHP 7.4,警告消失。

PHP 数组 警告偏 兼容性

评论

1赞 Foobar 12/20/2022
在 php8 中,类型更加严格。因此,如果您想摆脱该消息,请执行.因为在这一点上,实际上可以是一个数组或一个布尔值。if ( is_array($meta_value) && isset( $meta_value[ $meta_tuple['meta_key'] ] ) ) {$meta_value
0赞 YvesLeBorg 12/20/2022
强烈建议您彻底阅读有关升级到 8.x 主题的精彩手册。然后根据你在代码中找到的内容以及代码中有多少来制定一个计划。准备好更改代码并重新测试。
0赞 Andy 12/21/2022
感谢您的输入。在以下操作之后添加了代码行,警告已消失。$meta_values = wpsc_update_meta_cache( $meta_tuple['object_type'], $meta_tuple['object_id'] );

答:

0赞 Foobar 12/20/2022 #1

您可以更改此设置

if ( isset( $meta_value[ $meta_tuple['meta_key'] ] ) ) {
    return maybe_unserialize($meta_value[$meta_tuple['meta_key']]);
}

to(参见 Null 合并运算符)

if ($meta_value[ $meta_tuple['meta_key']] ?? null)
   return maybe_unserialize($meta_value[$meta_tuple['meta_key']]);
}

或(老派)

if ( 
     is_array($meta_value)
     && isset( $meta_value[ $meta_tuple['meta_key'] ] ) 

) {
    return maybe_unserialize($meta_value[$meta_tuple['meta_key']]);
}

评论

0赞 Andy 12/21/2022
谢谢大家的建议!