You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何使用moment.php打印指定月份所有天数?移除var_dump后异常排查

解决Moment.php移除var_dump后日期打印异常的问题

看起来你遇到了一个挺有意思的问题——保留var_dump时能正常输出日期,移除后反而出问题。我来帮你分析下原因并给出解决方案:

问题根源分析

  1. 私有属性直接访问:你代码里直接用$value->date访问Moment对象的属性,但date是Moment类的私有属性,正常情况下直接访问会触发PHP错误。而var_dump在调试模式下会暴露私有属性,但这并不代表你可以直接在业务代码里访问它。
  2. 迭代器/Generator特性getMomentsByWeekdays方法返回的可能是一个迭代器或者Generator对象。当你调用var_dump时,它会自动遍历这个迭代器并消耗掉所有元素,同时可能触发了对象的某些内部初始化逻辑;但移除var_dump后,直接遍历迭代器时,就会因为私有属性无法访问而报错。

解决方案

方案1:使用Moment的公共方法获取日期(推荐)

不要直接访问私有属性,改用Moment提供的format()方法来生成你需要的日期格式:

$weekdayNumbers = [1,2,3,4,5,6,7];
$m = new \Moment\Moment();
$dates = $m->getMomentsByWeekdays($weekdayNumbers, 3);

foreach($dates as $key=>$value){
    // 使用format方法获取日期,可自定义格式,比如'Y-m-d'或者'Y年m月d日'
    $date = $value->format('Y-m-d');
    echo $date."<br>";
}

方案2:将迭代器转换为数组

如果确实需要处理数组形式的结果,可以先用iterator_to_array把迭代器转换成普通数组,避免迭代器状态的影响:

$weekdayNumbers = [1,2,3,4,5,6,7];
$m = new \Moment\Moment();
// 转换迭代器为数组
$dates = iterator_to_array($m->getMomentsByWeekdays($weekdayNumbers, 3));

foreach($dates as $key=>$value){
    $date = $value->format('Y-m-d');
    echo $date."<br>";
}

额外提示:满足“打印指定月份所有天数”的需求

你当前的代码用getMomentsByWeekdays其实是获取指定工作日的N个日期,和“打印指定月份所有天数”的需求不符。如果要实现这个需求,可以这样写:

// 指定目标月份,比如2018年4月
$targetMonth = new \Moment\Moment('2018-04-01');
// 获取该月份的总天数
$totalDays = $targetMonth->getDaysInMonth();

// 遍历每一天并输出
for ($day = 1; $day <= $totalDays; $day++) {
    $date = $targetMonth->setDay($day)->format('Y年m月d日');
    echo $date."<br>";
}

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

火山引擎 最新活动