如何使用moment.php打印指定月份所有天数?移除var_dump后异常排查
解决Moment.php移除var_dump后日期打印异常的问题
看起来你遇到了一个挺有意思的问题——保留var_dump时能正常输出日期,移除后反而出问题。我来帮你分析下原因并给出解决方案:
问题根源分析
- 私有属性直接访问:你代码里直接用
$value->date访问Moment对象的属性,但date是Moment类的私有属性,正常情况下直接访问会触发PHP错误。而var_dump在调试模式下会暴露私有属性,但这并不代表你可以直接在业务代码里访问它。 - 迭代器/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




