2008-08-21 7 views
5

Ich habe Gerüchte gehört, dass PHP plant, einen "goto" -Befehl einzuführen. Was soll es tun?GOTO-Befehl in PHP?

Ich habe versucht, ein wenig zu suchen, aber nichts schrecklich beschreibend gefunden. Ich verstehe, dass es kein "GOTO 10" -ähnlicher Befehl sein wird ...

+1

Und in der Tat ist es in PHP5 ist. Und was es tut, ist "einfach nur goto". –

Antwort

9

Sie fügen kein echtes GOTO hinzu, sondern erweitern das BREAK-Schlüsselwort, um statische Labels zu verwenden. Grundsätzlich wird es die Möglichkeit verbessern, aus Switch verschachtelte if-Anweisungen zu brechen. Hier ist das Konzept Beispiel, das ich gefunden:

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

Natürlich, wenn der GOTO „Gerücht“ out war, gab es nichts, einige bösen Jungs zu stoppen einen zusätzlichen comefrom Witz zu propagieren. Sei auf deinen Zehenspitzen. auch

Siehe:

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

+4

Ich denke, das ist wirklich verwirrend, weil eine Pause von selbst aus der for-Schleife springen wird, nicht nur die if-Anweisung. – DisgruntledGoat

3

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

GOTO ist nur eine explizite Flow-Control-Anweisung wie jede andere. Nehmen wir an, Sie haben einige verschachtelte Loops und Sie müssen nur eine Sache finden. Sie können eine bedingte Anweisung (oder mehrere) eingeben und wenn die Bedingungen richtig erfüllt sind, können Sie eine GOTO-Anweisung verwenden, um alle Schleifen zu verlassen (anstatt eine 'break'-Anweisung auf jeder Verschachtelungsebene mit einer bedingten Anweisung zu haben) . für jeden und ja, ich glaube, die traditionelle Implementierung genannt Etiketten haben, die die GOTO-Anweisung mit Namen springen können Sie etwas tun können.

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

Dies ist eine einfacher (und effiziente) -Implementierung . als ohne GOTO-Anweisungen würden die äquivalent sein: sind dre

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

im zweiten Fall (was allgemein üblich ist) Die bedingten Anweisungen, die offensichtlich langsamer sind als nur eine. Aus Gründen der Optimierung/Vereinfachung sollten Sie GOTO-Anweisungen daher in eng verschachtelten Schleifen verwenden.

+0

Sie brauchen GOTO aus diesem Grund nicht. Sehen Sie meine Antwort für einen strukturierteren Weg, das Ausbrechen von Schleifen auszudrücken, der immer funktioniert und keine Ineffizienz verursacht. Goto für diesen Zweck ist einfach dumm. (Nicht eine Reflexion über Sie.) –

0

Es looks wie es derzeit in PHP 5.3 ist, ist aber noch nicht vollständig dokumentiert. Von dem, was ich sagen kann, teilt es seine Goto-Syntax mit C, also sollte es leicht zu erlernen und zu verwenden sein. Denken Sie nur an Dijkstras warning und verwenden Sie es nur bei Bedarf.

0

@ steveth45

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

Dann müssen Sie nicht über die Verwendung mehrerer break-Anweisungen oder gehe zu kümmern: D

+0

stimme ich ein wenig, aber manchmal mehrere Ebenen von verschachtelten Schleifen in unvermeidbar und sollte nicht verspottet werden. – Christian

0

In der von steveth45 gegebenen Beispiel können Sie stattdessen eine Funktion verwenden:

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

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

Ich bin immer wieder erstaunt wie unglaublich dumm die PHP-Designer sind. Wenn der Zweck der Verwendung GOTOs ist aus mehrfach verschachtelten Schleifen effizienter dort zu machen bricht ein besserer Weg: markierte Codeblocks und brechen Aussagen, die Etiketten verweisen kann:

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

Jetzt ist klar, welche Schleife/Block zum Beenden und der Ausgang ist strukturiert; Sie können nicht Spaghetti Code mit diesem wie Sie können mit echten GOTOS bekommen.

Dies ist eine alte, alte, alte Idee. Die Entwicklung eines guten Kontrollflussmanagements Strukturen wurde seit den 70er Jahren gelöst, und die Literatur zu all diesen ist seit langem geschrieben. Das Bohm-Jacopini-Theorem zeigte, dass alles mit Funktionsaufruf, Wenn-Dann-Else und While-Schleifen codieren konnte. In der Praxis, Bohm-Jacopini-Stil Kodierung benötigt zusätzliche boolean Flags ("setzen Sie dieses Flag, um aus der Schleife zu bekommen" ), die klobig Codierung klug und ineffizient war (Sie nicht solche wollen Flags in Ihrer inneren Schleife). Mit if-then-else, verschiedenen Schleifen (während, für) und break-to-etikettierten Block können Sie jeden Algorithmus ohne Effizienzverlust codieren. Warum lesen die Leute nicht die Literatur, anstatt zu kopieren, was C getan hat? Grrr.

+0

Ist diese _break-to-etikettierte-block_ Sache, die Sie genau erwähnt haben, was mit dieser neuen PHP-Funktion vorgeschlagen wird? Verzeihen Sie, wenn ich falsch liege –

+0

Welches neue Feature? GEHE ZU? GOTO bringt Sie zu einem Etikett, das in einen beliebigen Teil Ihres Codes eingefügt wird. Der Break-to-Label * nur * erlaubt Breaks von innerhalb eines Blocks zum Blockausgang. –

+0

Nun, ich denke, das _break-to-label_ Ding, das du erwähnt hast, ist genau **, was gemunkelt wird, um in php6 eingeführt zu werden. Es belebt GOTO nicht. –