Question

J'ai entendu des rumeurs que PHP est la planification sur l'introduction d'un "goto" de commande.Qu'est-il censé faire?

J'ai essayé de chercher un peu, mais je n'ai pas trouvé quelque chose de terriblement descriptif.Je comprends que ce ne sera pas un "GOTO 10"-comme le commande...

Était-ce utile?

La solution

Ils ne sont pas l'ajout d'un réel GOTO, mais en prolongeant le mot-clé BREAK utiliser des étiquettes.Fondamentalement, il sera l'amélioration de la capacité de sortir de commutateur instructions if imbriquées.Voici le concept exemple que j'ai trouvé:

<?php
for ($i = 0; $i < 9; $i++) {
    if (true) {
        break blah;
    }
    echo "not shown";
    blah:
    echo "iteration $i\n";
}
?>

Bien sûr, une fois que le GOTO "rumeur" a été, il n'y a rien pour arrêter un mal de gars à se propager supplémentaires COMEFROM blague.Être sur vos orteils.

Voir aussi:

http://www.php.net/~derick/rencontre-notes.html#ajout-goto

Autres conseils

Je suis toujours étonné de voir comment incroyablement stupide PHP concepteurs sont.Si le but de l'utilisation des GOTOs est de faire sortir de multiplier imbriquée des boucles plus efficace il y a une meilleure façon:étiquetés blocs de code et break qui peut faire référence à des labels:

a:  for (...) {
    b:  for (...) {
         c: for (...) {
               ...
               break a;
           }
       }
   }

Elle est maintenant clair de la boucle/bloc à la sortie, et la sortie est structuré;vous ne pouvez pas obtenir de code spaghetti avec ce que vous pouvez avec de vrais gotos.

C'est une vieille, vieille, vieille idée.La conception d'un bon contrôle de la gestion des flux les structures ont été résolues depuis les années 70, et la littérature dans tout ça est depuis longtemps écrit.Le Bohm-Jacopini théorème a montré que vous pouvez coder quoi que ce soit avec la fonction d'appel, if-then-else, et des boucles while.Dans la pratique, pour sortir de profondément des blocs imbriqués, Bohm-Jacopini style codage supplémentaire boolean drapeaux ("définir cet indicateur pour sortir de la boucle") qui a été maladroit de codage sage et inefficace (vous ne voulez pas les drapeaux dans votre boucle interne).Si-alors-sinon, différentes boucles (while,for) et saut-à-étiquetés bloc, vous avez peut-code de l'algorithme sans aucun perte de rendement.Pourquoi ne pas les gens lisent de la littérature, au lieu de la copie de ce que C était le cas?Grrr.

Certes, je ne suis pas un programmeur PHP, et je ne sais pas ce que PHP exact de la mise en œuvre de GOTO va ressembler, mais ici, c'est ma compréhension de GOTO:

GOTO est juste un plus explicite des flux de contrôle comme les autres.Disons que vous avez quelques boucles imbriquées et vous avez seulement besoin de trouver une chose.Vous pouvez mettre dans une instruction conditionnelle (ou plusieurs) et lorsque les conditions sont remplies correctement, vous pouvez utiliser une instruction GOTO pour sortir de toutes les boucles, (au lieu d'avoir une "pause" énoncé à chaque niveau d'imbrication avec une instruction conditionnelle pour chaque.Et oui, je crois que la traditionnelle mise en œuvre est d'avoir nommé des étiquettes que l'instruction GOTO peuvent sauter par son nom.Vous pouvez faire quelque chose comme ceci:

for(...) {
    for (...) {
        for (...) {
        // some code
        if (x) GOTO outside;
        }
    }
} 
:outside

C'est plus simple (et plus efficace) de la mise en œuvre de sans GOTO.L'équivalent serait:

for(...) {
    for (...) {
        for (...) {
            // some code
            if (x) break;
        }
        if(x) break;
    }
    if(x) break;
} 

Dans le second cas (qui est de pratique courante) il y a trois instructions conditionnelles, ce qui est évidemment plus lent que le fait d'en avoir un.Donc, pour l'optimisation de la/des raisons de simplification, vous pouvez utiliser les instructions GOTO dans des contenants de boucles imbriquées.

Dans l'exemple donné par steveth45 vous pouvez utiliser une fonction à la place:

function findItem(...) {
  for (...) {
    for (...) {
      for (...) {
        if (x) {
          return theItem;
        }
      }
    }
  }
}

// no need for label now
theItem = findItem(a, b, c);

Il regarde comme il est actuellement en PHP 5.3, mais n'est pas entièrement encore documentées.À partir de ce que je peux dire, il partage son goto syntaxe du C, de sorte qu'il devrait être facile à comprendre et à utiliser.Rappelez-vous juste de Dijkstra avertissement et de l'utiliser uniquement lorsque cela est nécessaire.

@steveth45

Ma règle d'or est que si vous avez le code imbriqué plus de 3 niveaux de profondeur, vous faites quelque chose de mal.

Ensuite, vous n'avez pas à vous inquiéter au sujet de l'utilisation de plusieurs break ou goto :D

il y a un goto en php -> http://php.net/manual/en/control-structures.goto.php, mais je ne voudrais pas l'utiliser, il suffit d'écrire de code...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top