Php 如何避免选项过多的大开关语句

Php 如何避免选项过多的大开关语句,php,Php,在一个类中,我有一个方法,它主要包含一个巨大的switch语句(大约250行!!!),根据输入调用不同的方法。 是的,它是有效的,但它只是简单的丑陋,我觉得应该有一个更优雅的解决方案 它看起来像这样: private function choosePartnerMethod($oST, $sPartner) { $oPartnerReport = null; switch ($sPartner) { case 'aertpa'

在一个类中,我有一个方法,它主要包含一个巨大的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();
但正如您所看到的,在某些情况下,不止一个匹配一个方法


有人知道如何更好地解决这个问题吗

我在想:

$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可以改进它。或者最好把你的答案和我的答案结合起来。