在一个类中,我有一个方法,主要包含一个巨大的switch语句(约250行!!!),根据输入调用不同的方法。 是的它有效,但它很简单,我觉得应该有一个更优雅的解决方案。
看起来与此类似:
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();
但正如您所看到的,有些情况下不止一种方法匹配。
有人知道如何解决这个问题吗?
答案 0 :(得分:1)
我正在思考类似的事情:
$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();
}
}
答案 1 :(得分:1)
您可能会做这样的事情:
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]}();
}
}
}