2013-06-16 8 views
17

In PHP, ist es möglich, von einem PHP-Code-Block (d. H. Die PHP-Tags) zu beenden?Wie kann ich den PHP-Codeblock verlassen?

<?php 
    if (!A) phpexit(); 
    print("1"); 
?> 

<?php 
    print("2"); 
?> 

Also, wenn A wahr ist, dann ist das Ergebnis 12, und wenn A falsch war, dann führen 2 ist.

Ich weiß, dass Sie dies mit if-Anweisung oder etwas tun können, aber ich möchte wissen, ob es auch einige spezielle PHP-Funktion gibt, die dies tun können.

+1

Nein, so etwas gibt es nicht. Ich kann mir gar nicht vorstellen, wo du es benutzen könntest. – Hast

+13

Was ist mit 'if' passiert? – deceze

+2

Was Sie brauchen, ist 'goto' aber' goto' = ** schlechtes Design ** ... Es gibt 'if else' für das, was Sie brauchen. – CodeAngry

Antwort

29

Es ist die goto Betreiber aber ich rate dringend gegen diese Art von Tricks ("Spaghetti-Code"). Sie verwenden besser strukturierte if Blöcke, da ist nichts falsch mit ihnen.

Vor goto verwenden, sollten alternative Lösungen: zum Beispiel, können Sie include verschiedene Skripte auf dem A Zustand abhängig.

enter image description here

+6

+1. Ein Bild sagt mehr als tausend Worte hier :-) – bwoebi

+5

Ich verurteile dies nicht nur wegen des konstruktiven 'include' Teiles der Antwort. Das Bild ist lustig, aber nicht konstruktiv. Ich weiß, dass es beliebt ist, wieder zu sein, aber goto selbst bedeutet nicht immer Spaghetti-Code. Um den Programmablauf zu unterbrechen, springt man gerne von der Mitte des Zyklus in die Mitte einer anderen Funktion und benutzt Spaghetti. Aber wenn der Sprung klar ist und den Kontext nicht unterbricht (wie in diesem Fall), glaube ich, dass es in Ordnung ist zu verwenden. –

+2

@ JanTuroò: Ja, ich benutze immer noch in einigen meiner C-Programme, zum Beispiel um einen allgemeinen Fehlerbehandlungsblock innerhalb einer verschachtelten Schleife zu erreichen. Das Problem mit goto ist, dass Sie, sobald Sie es auf legitime Weise verwenden, es bald verwenden, um schlecht entworfene Kontrollflüsse zu "patchen". Aber dein Standpunkt ist gut ... und ich versuche immer, meine Antworten konstruktiv zu gestalten. – gd1

11

Nein, es gibt keine. Aber was Sie tun könnten, ist ein Etikett am Ende jedes Blocks und dann verwenden Sie goto (nicht empfohlen, aber wenn Sie nicht wollen, eine große if ... (ps: siehe die Antwort von @ gd1 als Hinweis hier; -P)).

<?php 
    if (!A) goto exit_1; 
    print("1"); 
exit_1: ; 
?> 

<?php 
    print("2"); 
exit_2: ; 
?> 
+1

... warum wurde das heruntergeregelt? Ich empfehle es ausdrücklich nicht ... – bwoebi

+0

-1 Dies ist extrem schlecht Codierungspraxis, da es zu Spaghetti-Code führt http://en.wikipedia.org/wiki/Spaghetti_code – Precastic

+1

+1 Balanced unnötige downvote – gd1

18

Es konnten zwei Lösungen sein:

1) weniger hacky

schließen Sie den Code in separaten Dateien im Block haben. Sie können return in ihnen verwenden Verarbeitung zu stoppen Datei enthalten

//file1.php 
if (!A) return; 
print("1"); 

// file2.php 
print("2"); 

<?php include "file1.php";?> 
<?php include "file2.php";?> 

2) mehr Hacky (andere werden mich wahrscheinlich töten)

den Block in do { ... } while(false); Block Setzen und brechen aus ihm

<?php do { 
    if (!A) break; 
    print("1"); 
} while(false); ?> 

<?php do { 
    print("2"); 
} while(false); ?> 
+2

+1.Ich würde dich für den ersten töten: verschwenden eine ganze Datei für nur eine Code-Zeile :-P Aber die zweite, die ich mag :-) – bwoebi

+2

Ich glaube, die Frage wurde eingeengt und der Block ist eine komplexe konsistente Code verdient getrennte Datei. Könnte sein. Der zweite ist auf jeden Fall besser für kurze Teile geeignet, kann aber auf den ersten Blick erschreckend sein. –

+1

+1 für die "include" -Lösung und es ist gut zu bemerken, dass, wenn die Codeblöcke sind relativ klein und einfach, als es keine Notwendigkeit für die Aufnahme, goto, oder "hacky" while-Schleifen, und eine einfache, wenn das tun wird Trick. – gd1

4

Nein, und es würde keinen Sinn ergeben. Stellen Sie sich vor Sie könnte dies tun, und Sie hatte dieses Stück Code:

<?php 
    if (!A) phpexit(); 

    if (B) { 
?> 
     <b>Foo</b> 
<?php 
    } 
?> 
    <i>Baz</i> 

Wo würde phpexit() Sprung zu? Der then Block der if (B) springt aus und in einem PHP-Block, aber du willst nicht von auf <b>Foo</b> springen, oder? Es wäre nicht sinnvoll, in einen then Block zu springen, ohne den Zustand zu überprüfen.

As gd1 already showed, könnten Sie dies mit goto tun, aber es würde Ihren Code unstrukturiert machen. Sie würden es sich selbst (und zukünftigen Betreuern Ihres Codes) sehr schwer machen, den Fluss Ihres Codes zu verstehen, wenn Ihr Code überall herumspringt.

In Low-Level-Sprachen (d. H.Assembly) Sie nur haben Sprünge zum Arbeiten, aber in höheren Sprachen abstrahieren Sie diese mit Strukturen wie if, for und while. Diese bieten Struktur von absichtlich verhindern Sie von zu jeder Stelle zu springen, die Sie wollen.

6

Wenn Sie Aussenseiter Pop-Kultur zu viel Respekt und fühlen Sie sich fit in müssen (! Und beliebt zu bekommen), hier ist eine Lösung ohne goto:

<?php 
call_user_func(function() { 
    if (!A) return; 
    print("1"); 
}); 
?> 

<?php 
    print("2"); 
?> 
8

Wenn dies alles andere als ein Experiment ist, Sie machen es falsch. Beenden Sie die programmorientierte Programmierung als Start-Lern-OOP.

Nun ... Sie könnten immer den Inhalt <?php ?> in anonyme Funktion umhüllen;

<?php $f = function() use (&$a) { 

    if ($a) 
    { 
     echo 1; 
     return; 
    } 
    echo 2; 

};$f(); ?> 

<?php $f = function() { 

    echo 2; 

};$f(); ?> 

Dies würde in PHP 5.3 arbeiten. Und wenn Sie Variablen teilen müssen, können Sie sie in den Geltungsbereich mit use() Anweisung in der Definition injizieren.

Aber lassen Sie mich wiederholen:

Wenn Sie so etwas wie dies in der Produktion Code tun, werden Sie es falsch zu machen.

+0

die 'do {} while (0);' ist schlauer. Doing it a Closure ist korrekt, aber a) langsamer und mit mehr Speicher und b) nicht so schön. (aber ich nicht downvote: es ist richtig) – bwoebi

+0

Hmm .. Jetzt bin ich neugierig. Funktionieren die sofort aufgerufenen Funktionen (wie '(function() {..})()') in PHP (wie in Javascript), oder ist das ein Syntaxfehler? – Izkata

+1

@Izkata, ich habe das eigentlich probiert, aber hat nicht funktioniert. Parser meckerte über unerwartete Klammern. –

0

Ich habe in mehreren Situationen führen, wo der Rest eines Blocks PHP-Code muss aufgrund einer Fehlerbedingung zu übersprungen werden (Datenbankverbindungsfehler, ungültige Eingabe, etc.). Als Student verwendet mein Professor einfach die, was das Parsen der Datei stoppt und die Seite unvollständig lässt, ohne die Fußzeile oder sogar die schließenden HTML-Tags </body></html>. Selbst wenn ein Fehler auftritt, gibt es keinen Grund, ungültiges HTML zu generieren, indem die schließenden Tags abgeschnitten werden.

Natürlich würde ein rein strukturierter Ansatz if Aussagen verwenden, und dies ist in den meisten Fällen besser als goto. Ich denke jedoch, dass, wenn Sie nur versuchen, aus einem PHP-Codeblock herauszuspringen, das Einfügen großer Code-Segmente in eine Struktur eher unelegant ist und den Code schwerer verständlich machen kann, als einfach eine goto-Anweisung zu verwenden springt an das Ende des PHP-Blocks, kurz vor dem ?>, da es schwer wird sich zu erinnern, dass eine ganze Menge Code tatsächlich Teil einer bedingten Anweisung 50+ Zeilen unter den if oder elseif Zeilen ist.

Jeder sagt, dass goto Aussagen sind schlecht, aber es gibt gültige Verwendungen für goto, die den Code leichter verständlich zu machen, wie aus tief verschachtelten Kontrollstrukturen zu springen und bis zum Ende eines PHP-Code-Block springen (vorausgesetzt, dass keine Ein eingebautes Sprachkonstrukt existiert dafür).

Ein Code-Konstrukt wie goto ist nicht von Natur aus böse. Es kommt darauf an, wie Sie es verwenden.

Verwandte Themen