如何创建动态函数名?

How to create a dynamic function name?

我正在使用根据频率添加日期的碳。目前这是我的工作代码。

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);

我知道这行不通。有什么办法可以实现吗?

您不需要动态函数名。这样的代码很难理解。就像这样:

$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

而不是 "Year" 它也适用于日、周、月等 (see units relative Formats) 你甚至不需要 Carbon,DateTime 做得很好。

可以做到,但要么需要在变量中捕获它,要么使用 {} 分隔代码

ex: $repetition_frequency = 'Year';

$function = 'add'.$repetition_frequency;

$test_date->$function($repetition);

还要注意开箱即用的日期添加功能,例如 modify 和 addMonths,如果您要将 1 个月添加到 2020-01-31,您最终会得到 2020-03-03,这可能不是你想要的结果。如果期望的结果应该是 2020-02-29,Carbon 带有一个方便的 addMonthNoOverflow 函数。

只需使用开箱即用的 addUnit 方法:

Carbon::now()->addUnit($repetition_frequency, $repetition)

它将无差别地使用 Daydaydays cases/pluralization 和任何支持的 Carbon 单位。