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

PHP 8.0中count()参数类型错误的解决咨询

PHP 8.0下count()函数类型错误的解决方法

错误情况

在PHP 8.0环境中运行代码时触发以下错误:

Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, string given in

错误指向代码行:

if ( isset( $attachment_metadata['sizes'] ) && count( $attachment_metadata['sizes'] ) && ( isset( $attachment_metadata['sizes'][ $intermediate_size ] ) ) ) {

问题原因

PHP 8.0开始严格限制count()函数的参数类型,仅允许传入数组或实现Countable接口的对象。如果$attachment_metadata['sizes']的值是字符串(比如元数据序列化失败、手动读取元数据时处理出错),就会触发这个类型错误。

解决步骤

1. 先验证参数可计数性再调用count()

直接修改出错的判断条件,加入is_countable()检查,确保$attachment_metadata['sizes']可以被count()处理:

if ( isset( $attachment_metadata['sizes'] ) && is_countable( $attachment_metadata['sizes'] ) && count( $attachment_metadata['sizes'] ) && isset( $attachment_metadata['sizes'][ $intermediate_size ] ) ) {

is_countable()是PHP 7.3+引入的函数,专门用来检测变量是否可被count(),完美适配PHP 8.0的类型要求。

2. 用WordPress官方函数读取附件元数据

原代码手动读取并反序列化元数据的逻辑容易出错,建议替换为WordPress提供的wp_get_attachment_metadata()函数,它会自动处理元数据的序列化/反序列化,返回标准数组格式:
替换原代码中这段:

$image_meta = get_post_meta( $attachment_id, '' );
// Clean up the meta array
foreach ( $image_meta as $meta_name => $meta_value ) {
    $image_meta[ $meta_name ] = maybe_unserialize( array_pop( $meta_value ) );
}
$attachment_metadata = isset( $image_meta['_wp_attachment_metadata'] ) ? $image_meta['_wp_attachment_metadata'] : null;

改为:

$attachment_metadata = wp_get_attachment_metadata( $attachment_id );

这一步能从根源避免sizes字段出现非数组类型的情况。

3. 增加兜底的数组类型检查

为了进一步提升代码稳定性,可以在判断最外层增加$attachment_metadata是否为数组的检查:

if ( is_array( $attachment_metadata ) && isset( $attachment_metadata['sizes'] ) && is_countable( $attachment_metadata['sizes'] ) && count( $attachment_metadata['sizes'] ) && isset( $attachment_metadata['sizes'][ $intermediate_size ] ) ) {

新手学习提示

  • PHP 8.0+对类型校验的要求大幅提升,写代码时要养成先做类型检查再操作的习惯,避免类似的类型错误。
  • 基于WordPress开发时,优先使用官方封装的函数,不要手动处理底层数据,官方函数已经考虑了各种边界情况和版本兼容问题。

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:55:14