Php 如何创建动态函数名?

Php 如何创建动态函数名?,php,laravel-5,php-carbon,Php,Laravel 5,Php Carbon,我使用的是碳元素,根据频率添加日期。目前这是我的工作代码 if ($repetition_frequency == 'Day') { $test_date->addDays($repetition); } else if ($repetition_frequency == 'Week') { $test_date->addWeeks($repetition); }else if ($repetition_frequency == 'Month') { $t

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

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条件,并根据$repeation\u频率调用什么函数

目标:


我知道这行不通。有没有办法做到这一点?

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

$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
与年不同,它也适用于日、周、月等。
你甚至不需要碳元素,DateTime做得很好。

这是可以做到的,但是你需要在变量中捕获它,或者使用{}来分隔代码

ex: $repetition_frequency = 'Year';

$function = 'add'.$repetition_frequency;

$test_date->$function($repetition);
此外,还应注意“修改”和“添加月数”等现成的日期添加功能,如果要将1个月添加到2020-01-31,则最终将得到2020-03-03,这可能不是您想要的结果。如果所需结果应为2020-02-29,Carbon附带一个方便的addMonthNoOverflow函数。

只需使用现成的addUnit方法即可:

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

它将不分天、天、天、案例/复数和任何支持的碳单位。

$test\u date->{'add'.$repeation\u frequency}$repeation可能有效,但您可能应该将其作为参数提交,而不是使用动态函数。动态变量名和方法名很容易导致问题。@Qirel你能举个例子吗?仅仅因为他能,并不意味着他应该@jspit的答案要好得多。在这个用例中,了解一种语言是如何工作的以及在其他情况下可能发生什么是有价值的知识。
Carbon::now()->addUnit($repetition_frequency, $repetition)