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
相关产品推荐
相关产品推荐

