Php 如何避免选项过多的大开关语句
在一个类中,我有一个方法,它主要包含一个巨大的switch语句(大约250行!!!),根据输入调用不同的方法。 是的,它是有效的,但它只是简单的丑陋,我觉得应该有一个更优雅的解决方案 它看起来像这样:Php 如何避免选项过多的大开关语句,php,Php,在一个类中,我有一个方法,它主要包含一个巨大的switch语句(大约250行!!!),根据输入调用不同的方法。 是的,它是有效的,但它只是简单的丑陋,我觉得应该有一个更优雅的解决方案 它看起来像这样: private function choosePartnerMethod($oST, $sPartner) { $oPartnerReport = null; switch ($sPartner) { case 'aertpa'
private function choosePartnerMethod($oST, $sPartner)
{
$oPartnerReport = null;
switch ($sPartner) {
case 'aertpa':
$oPartnerReport = $oST->aertpa();
break;
case 'adrtsh':
$oPartnerReport = $oST->adrtsh();
break;
case 'adwev':
$oPartnerReport = $oST->adwev();
break;
case 'agft':
$oPartnerReport = $oST->agft();
break;
case 'alan':
case 'alanrs':
$oPartnerReport = $oST->alan();
break;
case 'andfe':
$oPartnerReport = $oST->anfe();
break;
case 'bsera':
case 'bsrhes':
case 'bshwet':
$oPartnerReport = $oST->bsera();
break;
.... many many more...
default:
break;
}//end switch
return $oPartnerReport;
}
如果始终有一个案例匹配一个方法,我可以动态调用它们,如下所示:
$oPartnerReport = $oST->$sPartner();
但正如您所看到的,在某些情况下,不止一个匹配一个方法
有人知道如何更好地解决这个问题吗 我在想:
$partnersCollection = array(
'aertpa' => array('aertpa'),
'bsera' => array('bsera', 'bsrhes', 'bshwet'),
// ....... method => partners
);
foreach ($partnersCollection as $methodToBeCalled => $partners) {
if (in_array($sPartner, $partners)) {
return $oST->$methodToBeCalled();
}
}
您可能会这样做:
class PartnerMethod{
private $partners = array(
'aertpa' => 'aertpa',
'adrtsh' => 'adrtsh',
);
public function choosePartnerMethod($oST, $sPartner){
if(in_array($sPartner, $this->partners)){
return $oST->{$this->partners[$sPartner]}();
}
}
}
如果250个不同的案例是硬编码的,那么可能没有更好的方法了。如果它来自数据库或其他什么东西,你可以循环使用它。看起来不错。我将为我考虑一下最佳设置。您的示例没有涵盖多个合作伙伴匹配相同方法的情况。另外,_array方法中
的参数顺序是错误的,感谢您指出,noob错误。不,它不包括匹配同一方法的多个合作伙伴,这主要是为了举例。我相信OP可以改进它。或者最好把你的答案和我的答案结合起来。