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

