我使用的是carbon,可以根据频率添加日期。目前,这是我的工作代码,我的目标是删除if条件,并取决于我将通过$repetition_frequency调用什么函数。
if ($repetition_frequency == 'Day') {
$test_date->addDays($repetition);
} else if ($repetition_frequency == 'Week') {
$test_date->addWeeks($repetition);
}else if ($repetition_frequency == 'Month') {
$test_date->addMonths($repetition);
}else if ($repetition_frequency == 'Year') {
$test_date->addYears($repetition);
}
我的目标是去掉if条件,用$repetition_frequency来决定我将调用什么函数。
目标。
ex: $repetition_frequency = 'Year';
$test_date->'add'.$repetition_frequency->($repetition);
// i want => $test_date->addYear->($repetition);
我知道这样做是行不通的 有什么办法可以实现吗?
只需使用 addUnit
方法可开箱即用。
Carbon::now()->addUnit($repetition_frequency, $repetition)
它将采取冷漠的 Day
, day
, days
casepluralization和任何支持的Carbon单位。
你不需要动态函数名。这样的代码很难理解。只要像这样做就可以了。
$test_date = Carbon\Carbon::today(); //2020-06-10
$repetition = 3;
$repetition_frequency = 'Year';
$test_date->modify($repetition." ".$repetition_frequency);
echo (string)$test_date;
输出:
2023-06-10 00:00:00
除了 "年 "之外,它还可以用 "日"、"周"、"月 "等单位来代替。参见单位相对格式)你甚至不需要Carbon,DateTime就能做得很好。
它可以做到,但你需要在一个变量中捕获它,或者使用{}来分离代码。
ex: $repetition_frequency = 'Year';
$function = 'add'.$repetition_frequency;
$test_date->$function($repetition);
同时要警惕开箱即用的日期添加功能,比如修改和addMonths,如果你要在2020-01-31上添加1个月,你最终会得到2020-03-03,这可能不是你想要的结果。 Carbon自带了一个方便的 addMonthNoOverflow
如果所需的结果是2020-02-29,则使用函数。