Frage

Ich habe Gerüchte gehört, dass PHP die Einführung eines „goto“-Befehls plant.Was soll es tun?

Ich habe ein bisschen gesucht, aber nichts sehr Beschreibendes gefunden.Ich verstehe, dass es kein „GOTO 10"-ähnlicher Befehl...

War es hilfreich?

Lösung

Sie fügen kein echtes GOTO hinzu, sondern erweitern das Schlüsselwort BREAK, um statische Beschriftungen zu verwenden.Im Grunde wird es die Fähigkeit zum Ausbrechen verbessern schalten verschachtelte if-Anweisungen.Hier ist das Konzeptbeispiel, das ich gefunden habe:

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

Sobald das „Gerücht“ von GOTO herauskam, gab es natürlich nichts mehr, was einige Bösewichte davon abhalten konnte, ein weiteres Gerücht zu verbreiten KOMME AUS Witz.Seien Sie auf der Hut.

Siehe auch:

http://www.php.net/~derick/meeting-notes.html#adding-goto

Andere Tipps

Ich bin immer wieder erstaunt, wie unglaublich dumm die PHP-Designer sind.Wenn der Zweck der Verwendung von Gotos darin besteht, aus multiplizierteren verschachtelten Schleifen effizienter auszubrechen, gibt es einen besseren Weg:Bezeichnete Codeblöcke und Break -Anweisungen, mit denen Bezeichnungen verweisen können:

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

Jetzt ist klar, welche Schleife/welcher Block verlassen werden soll, und der Ausgang ist strukturiert;Sie können damit keinen Spaghetti-Code erhalten, wie Sie es mit echten Gotos können.

Das ist eine alte, alte, alte Idee.Die Gestaltung guter Steuerungsstrommanagementstrukturen wurde seit den 70er Jahren gelöst, und die Literatur zu all dem ist längst geschrieben.Der Bohm-Jacopini-Theorem zeigte, dass Sie etwas mit Funktionsaufruf, If-Then-ELSE und während der Schleifen codieren konnten.Um in der Praxis aus tief verschachtelten Blöcken auszubrechen, erforderte Bohm-Jacopini-Stilcodierung zusätzliche booleale Flaggen ("Setzen innere Schleife).Mit if-then-else, verschiedenen Schleifen (während) und Breaking-to-Sabelled-Block können Sie einen Algorithmus ohne Effizienzverlust codieren.Warum lesen die Leute die Literatur nicht, anstatt zu kopieren, was C getan hat?Grrr.

Zugegeben, ich bin kein PHP-Programmierer und weiß nicht, wie PHPs genaue Implementierung von GOTO aussehen wird, aber hier ist mein Verständnis von GOTO:

GOTO ist nur eine explizitere Flusskontrollanweisung wie jede andere.Nehmen wir an, Sie haben einige verschachtelte Schleifen und müssen nur eine Sache finden.Sie können eine bedingte Anweisung (oder mehrere) einfügen und wenn die Bedingungen ordnungsgemäß erfüllt sind, können Sie eine GOTO-Anweisung verwenden, um alle Schleifen zu verlassen (anstatt auf jeder Verschachtelungsebene eine „break“-Anweisung mit einer bedingten Anweisung zu verwenden). für jede.Und ja, ich glaube, die traditionelle Implementierung besteht darin, benannte Labels zu haben, zu denen die GOTO-Anweisung namentlich springen kann.Sie können so etwas tun:

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

Dies ist eine einfachere (und effizientere) Implementierung als ohne GOTO-Anweisungen.Das Äquivalent wäre:

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

Im zweiten Fall (was gängige Praxis ist) gibt es drei bedingte Anweisungen, was offensichtlich langsamer ist als nur eine.Aus Optimierungs-/Vereinfachungsgründen möchten Sie möglicherweise GOTO-Anweisungen in eng verschachtelten Schleifen verwenden.

Im Beispiel von steveth45 Sie können stattdessen eine Funktion verwenden:

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

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

Es sieht aus wie es derzeit in PHP 5.3 ist, aber noch nicht vollständig dokumentiert ist.Soweit ich das beurteilen kann, teilt es seine Goto-Syntax mit C, sodass es leicht zu erlernen und zu verwenden sein sollte.Denken Sie nur an Dijkstras Warnung und verwenden Sie es nur, wenn es nötig ist.

@steveth45

Meine Faustregel lautet, dass Sie etwas falsch machen, wenn Sie Code mehr als 3 Ebenen tief verschachtelt haben.

Dann müssen Sie sich keine Gedanken über die Verwendung mehrerer break-Anweisungen oder goto machen :D

da ist ein goto in PHP -> http://php.net/manual/en/control-structures.goto.php, aber ich würde es nicht verwenden, sondern einfach normalen Code schreiben ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top