如何创建一个动态函数名?

问题描述 投票:-1回答:1

我使用的是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);

我知道这样做是行不通的 有什么办法可以实现吗?

php laravel-5 php-carbon
1个回答
1
投票

只需使用 addUnit 方法可开箱即用。

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

它将采取冷漠的 Day, day, days casepluralization和任何支持的Carbon单位。


2
投票

你不需要动态函数名。这样的代码很难理解。只要像这样做就可以了。

$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就能做得很好。


1
投票

它可以做到,但你需要在一个变量中捕获它,或者使用{}来分离代码。

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,则使用函数。

© www.soinside.com 2019 - 2024. All rights reserved.