我遇到了重构问题。我有许多类似的方法,但我找不到从它们中提取一行的方法,并制作另一种私有方法。
private function constructRules($rules, \Languages $langs) {
foreach ($rules as $fieldType => $rule) {
foreach ($langs->all() as $lang) {
//line below changes
$langRules[$fieldType . '[' . $lang->lang . ']'] = $rule;
}
}
return $langRules;
}
我在4个不同的地方有这些foreach循环。如果我接触foreach循环并返回数组,我仍然需要在方法中创建一个foreach循环,以填充此示例中的$ langRules。也许有简单的方法可以做到,但我无法看到它......
答案 0 :(得分:2)
这不仅仅是要解决"任务问题。部分代码进入回调?
private function constructRulesUsingCallBack($rules, \Languages $langs, $task) {
$langRules = [];
foreach ($rules as $fieldType => $rule) {
foreach ($langs->all() as $lang) {
$task($langRules, $fieldType, $lang, $rule);
}
}
return $langRules;
}
$langRules = constructRulesUsingCallBack($rules, $langs, function (&$langRules, $fieldType, $lang, $rule) {
$langRules[$fieldType . '[' . $lang->lang . ']'] = $rule;
});
我对PHP不太满意,我对内联函数表达式中需要的样板数量不满意,但是PHP似乎并没有很好地实现闭包(无论如何,我可以锻炼身体。
但是你可以按原样保留constructRulesUsingCallBack()
函数来处理循环,每次需要处理这些循环中的内容时,只需将回调体的不同实现传递给它。
根据您的示例,似乎可以满足您的需求。如果没有,请澄清,我可以增加它以满足您的需求。