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

PHP 8.2+中DateInterval动态属性弃用,无法重构DateTime类的解决办法

解决PHP 8.2+ DateInterval动态属性弃用问题的修改方案

直接给DateInterval实例添加动态属性(如$diff->w)在PHP 8.2+中已被禁用,我们可以通过独立维护计算后的间隔数据来替代修改原DateInterval对象,具体修改后的代码如下:

public static function getTimeAgo($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    // 计算周数和剩余天数,不再直接修改DateInterval实例
    $weeks = floor($diff->d / 7);
    $remainingDays = $diff->d - $weeks * 7;

    // 构建包含所有需要字段的关联数组,替代动态属性
    $intervalData = [
        'y' => $diff->y,
        'm' => $diff->m,
        'w' => $weeks,
        'd' => $remainingDays,
        'h' => $diff->h,
        'i' => $diff->i,
        's' => $diff->s,
    ];

    $string = array(
        'y' => 'ano',
        'm' => 'mes',
        'w' => 'semana',
        'd' => 'dia',
        'h' => 'hora',
        'i' => 'minuto',
        's' => 'segundo',
    );
    foreach ($string as $k => &$v) {
        // 从自定义数组中取值,而非原DateInterval对象
        if ($intervalData[$k]) {
            if($k == 'm') {
              $v = $intervalData[$k] . ' ' . $v . ($intervalData[$k] > 1 ? 'es' : '');
            } else {
              $v = $intervalData[$k] . ' ' . $v . ($intervalData[$k] > 1 ? 's' : '');
            }
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' atrás' : 'agora';
}

关键改动说明

  • 移除直接给$diff添加w属性和修改d属性的代码,改用独立变量计算周数与剩余天数
  • 创建$intervalData数组,整合DateInterval原有属性与计算后的周数、剩余天数,统一管理所有需要用到的间隔数据
  • 遍历字符串模板时,从$intervalData数组中读取对应字段值,避免访问DateInterval的动态属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:22:26