2009-09-23 8 views
0

Je voudrais savoir s'il y a de toute façon je peux le faire sans avoir à faire de même Si boucle dans chacun des cas de commutateur car c'est un peu répétitif.Récurrent si boucle dans un commutateur

switch ($val) { 
    case 1: 
     if(!$object->doSomething1()==$goodValue) 
     row .= $object->doSomething(); 
     break; 
    case 2: 
     if(!$object->doSomething2()==$goodValue) 
     row .= $object->doSomething(); 
     break; 
    case 3: 
     if(!$object->doSomething3()==$goodValue) 
     row .= $object->doSomething(); 
     break; 
} 
+0

Cela peut être parce qu'il est un exemple artificiel, mais je ne vois pas pourquoi vous avez une instruction switch à tout comme tous les cas font exaclty la même chose. – Jackson

+0

Il appelle une fonction différente dans chaque cas. – BraedenP

+0

à tous les répondeurs: attention, les «si» ne sont pas les mêmes, il teste une méthode différente 3 fois. toutes les réponses que j'ai vu jusqu'à présent sont fausses – knittl

Répondre

1
switch ($val) { 
    case 1: 
     $method .= 'method1'; 
     break; 
    case 2: 
     $method .= 'method2'; 
     break; 
    case 3: 
     $method .= 'method3'; 
     break; 
} 
$funcVal = $object->$method(); 
if(!$funcVal==$goodValue) $row .= $funcVal; 
+0

if (! $ Objet -> $ method() == $ goodValue) $ row. = $ Objet -> $ method(); J'essaye ce – Roch

+0

ok, mais le point reste le même, l'action effectuée est la même, seuls les appels de méthode diffèrent, donc seulement ceux-là devraient être commutés ... – NDM

+0

Mais si vous allez effectuer la même méthode appel 2 fois, il est préférable de stocker le résultat ... – NDM

4
switch ($val) { 
    case 1: 
    case 2: 
    case 3: 
     if(!$object->doSomething{$val}()==$goodValue) 
     row .= $object->doSomething(); 
     break; 
} 
+0

Je pense que vous avez manqué qu'il appelait une fonction différente pour chaque cas. Sinon, ce serait une bonne idée. – Tom

+0

Notez l'accolade $ val après doSomething dans l'instruction if dans mon exemple - si son exemple 'as is' est ce dont il a besoin, ma réponse fonctionnerait. –

+1

à ce stade, pourquoi même avoir l'instruction de commutateur du tout? – GSto

1

Pourquoi ne pas vous envelopper tout l'ensemble du dossier dans la boucle si?

if(!$object->doSomething()==$goodValue) { 
    switch ($val) { 
     case 1: 
      row .= $object->doSomething(); 
      break; 
     case 2: 
      row .= $object->doSomething(); 
      break; 
     case 3: 
      row .= $object->doSomething(); 
      break; 
    } 
} 
+0

désolé j'ai oublié de mentionner que la fonction appelée n'est pas la même dans chaque cas. – Roch

+0

Vous avez * remarqué * qu'il y a un nom de fonction différent dans l'instruction if pour chaque valeur, n'est-ce pas? – paxdiablo

+0

si la fonction appelée dans chaque cas n'est pas la même, elle n'est pas répétitive. est-ce? – Kennethvr

1

Sans savoir beaucoup sur ce doSomething1/2/3 ne il semble que vous avez besoin trop d'informations sur le fonctionnement interne de l'objet $. Il pourrait être intéressant d'exposer une fonction sur $ object qui peut prendre $ val à la place et doSomething1/2/3 en fonction de $ val en interne.

if(!$object->doSomething($val)==$goodValue) 
     row .= $object->doSomething(); 
     break; 
} 
1

if n'est pas une boucle, il est une condition, vous pourriez être source de confusion certaine.

en ce qui concerne votre question: puisque vous testez différentes méthodes, il n'y a pas de façon (simple, saine) de ne pas répéter les if. vous n'êtes pas après tout, ils testent tous des conditions différentes.

1

sans assumer les noms de méthode continue, ou en utilisant des trucs comme call_user_func(), juste une légère modification:

switch ($val) { 
    case 1: 
     $doResult = $object->doSomething1(); 
     break; 
    case 2: 
     $doResult = $object->doSomething2(); 
     break; 
    case 3: 
     $doResult = $object->doSomething3(); 
     break; 
} 
if($doResult !== $goodValue) 
    row .= $object->doSomething(); 
Questions connexes