8
votes

Écriture de commutation sans pause

Comment s'agit-il d'une option de cas dans une instruction de commutation qui ne contient pas de pause automatiquement vers l'avant vers un cas suivant sans chèque?

try {
    switch($param) {
        case "created":
            if(!($value instanceof \DateTime))
                throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param");
        case "Creator":
            if(!($value instanceof \Base\User)) {
                throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator");                  
            }
        default:
            $this->$param = $value;
            break;
    }
} catch(Exception $e) {
    echo $e->getMessage();
}


0 commentaires

6 Réponses :


1
votes

Parce que c'est comme ça que c'est fait C .


0 commentaires

1
votes

Peut-être que cela vous éclairera:

interrupteur de table de saut Question de cas


0 commentaires

0
votes

Pour répondre à votre "question réelle": Pourquoi est-ce que cela continue avec le cas "Créateur" pendant que le cas n'est pas "Créateur".

Parce que vous n'avez pas break . Sans cela, cela continuera aux cas en dessous. La seule solution que je peux penser consiste à mettre votre code par défaut dans les cas et à ajouter break .

En outre, vous n'avez pas besoin break sur le boîtier par défaut depuis son dernier cas dans le bloc de commutation.


0 commentaires

19
votes

Frassthrough était une caractéristique de conception intentionnelle pour permettre le code comme: xxx

Il est conçu de manière à ce que l'exécution tombe en panne de cas au cas.

Par défaut est un cas comme n'importe quel autre, sauf que le saut Il se produit si aucun autre cas n'a été déclenché. Il ne s'agit pas d'un "faire après avoir exécuté l'instruction de cas sélectionnée". Dans votre exemple, vous pouvez envisager: xxx

La règle de pouce ici est, si cela ne dépend pas du commutateur, déplacez-le du commutateur.


3 commentaires

J'ajouterais cela - tandis que la chute est parfois utile - il vaut mieux ne pas l'utiliser où les deux cas font quelque chose au lieu de tomber (bon: cas "créé": cas "Créateur": cas "quelque chose_else": do_stuff (); mauvais: cas "créé": do_stuff (); cas "Créateur": do_second_stuff (); cas "quelque chose_else": do_remaining_stuff (); )


@DBemerlin: C'est vraiment assez dangereux, bien que acceptable si les cas sont courts ou dans des langues qui soutiennent la franchise explicite (comme c #).


Le mieux est d'ajouter un commentaire à dire que les frassums sont intentionnels.



1
votes

Je ne vois pas vraiment ce que tu veux.

  1. Si vous souhaitez exécuter les trucs par défaut dans tous les cas, mettez-le après l'interrupteur.
  2. Si vous souhaitez exécuter les éléments par défaut uniquement dans le boîtier "créé" et dans le cas par défaut, échangez la position des sections "Création" et "Créateur" et mettez une pause après la première.
  3. Si vous souhaitez que le code ne fonctionne que si Créateur ou des correspondances créées, supprimez-vous de l'instruction de commutation et utilisez-le un indicateur IF / bien ou utilisez un drapeau et une instruction suivante.

    Tous les outils sont là.


2 commentaires

Ce n'est pas à propos de ce que je veux, c'est pourquoi une instruction de commutation fonctionne comme ceci.


Je m'excuse de savoir que j'ai mal compris la question. L'histoire est la réponse. Comme la plupart des programmes de programmation, quelqu'un l'a dit. C'est comme ça qu'ils ont dit. Il y a une certaine histoire là-bas (essentiellement que c a commencé), mais c'est la syntaxe.



1
votes

dans PHP 8, nous avons correspondant code>, similaire avec l'expression code> interrupteur code> mais est significativement plus courte:

  • Il ne nécessite pas de déclaration de pause li>
  • Il peut combiner des bras différents en un à l'aide d'une virgule li>
  • Il renvoie une valeur, il vous suffit donc d'attribuer une valeur une fois li> ul>

    Un exemple: p> xxx pré>

    voici son interrupteur code> équivalent: p>

    switch ($statusCode) {
        case 200:
        case 300:
            $message = null;
            break;
        case 400:
            $message = 'not found';
            break;
        case 500:
            $message = 'server error';
            break;
        default:
            $message = 'unknown status code';
            break;
    }
    


0 commentaires