2013-06-16 35 views
17

In PHP, è possibile uscire da un blocco di codice PHP (cioè i tag PHP)?Come uscire dal blocco di codice PHP?

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

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

Quindi, se A era vero, allora il risultato è 12, e se A era falso, poi risultato è 2.

So che si può fare questo con istruzione if o qualcosa del genere, ma voglio sapere se c'è anche qualche funzione speciale di PHP che può farlo.

+1

No, non esiste una cosa del genere. Non riesco neanche a immaginare dove potresti usarlo. – Hast

+13

Qualunque cosa sia successo a 'if'? – deceze

+2

Ciò di cui hai bisogno è 'goto' ma' goto' = ** design scarso ** ... C'è 'if else' per quello che ti serve. – CodeAngry

risposta

29

C'è l'operatore goto ma vi consiglio vivamente di non utilizzare questo tipo di trucchi ("spaghetti code"). È meglio usare i blocchi strutturati if, non c'è niente di sbagliato in essi.

Prima di utilizzare goto, prendere in considerazione soluzioni alternative : per esempio, si può include diversi script a seconda della condizione A.

enter image description here

+6

+1. Un'immagine dice più di mille parole qui :-) – bwoebi

+5

Non lo sottovaluta solo per la parte costruttiva 'include' della risposta. L'immagine è divertente, ma non costruttiva. So che è popolare essere agains goto, ma goto stesso non significa sempre codice spaghetti. Per interrompere il flusso del programma, come saltare da metà del ciclo a metà di un'altra funzione è un uso improprio e spaghetti. Ma se il salto è chiaro e non infrange il contesto (come in questo caso), credo che sia OK da usare. –

+2

@ JanTuroň: Sì, uso ancora goto in alcuni dei miei programmi C, ad esempio per raggiungere un blocco generale di gestione degli errori da un ciclo annidato. Il problema con goto è che, una volta iniziato a usarlo in modi legittimi, si inizia presto a usarlo per "applicare patch" a flussi di controllo mal progettati. Tuttavia, il tuo punto è buono ... e cerco sempre di rendere le mie risposte costruttive. – gd1

11

No non ce n'è. Ma quello che potresti fare è mettere un'etichetta alla fine di ogni blocco e quindi usare goto (non consigliato, ma quando non vuoi un grande if ... (ps: vedi la risposta di @ gd1 come suggerimento qui; -P)).

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

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

... perché è stato downvoted? Io NON l'ho consigliato esplicitamente ... – bwoebi

+0

-1 Questa è una pessima pratica di codifica in quanto conduce al codice spaghetti http://en.wikipedia.org/wiki/Spaghetti_code – Precastic

+1

+1 Variando non necessario bilanciato – gd1

18

Ci potrebbero essere due soluzioni:

1) meno hacky

includono il codice che avete in blocco in file separati. È possibile utilizzare return a loro di interrompere l'elaborazione incluso un file

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

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

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

2) più hacky (altri saranno probabilmente mi ucciderà)

Mettere il blocco in do { ... } while(false); blocco e pausa da

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

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

+1.Ti ucciderei per il primo: sprecare un intero file per una sola riga di codice :-P Ma il secondo mi piace :-) – bwoebi

+2

Credo che la domanda sia stata ristretta e che il blocco sia un file complesso e coerente che merita un file separato. Può essere. Il secondo è sicuramente più adatto per le parti brevi, ma può essere spaventoso a prima vista. –

+1

+1 per la soluzione "include" ed è bene notare che, se i blocchi di codice sono relativamente piccoli e semplici, non c'è bisogno di inclusione, goto o "hacky" mentre i loop, e un semplice se lo farà trucco. – gd1

4

No, e non avrebbe senso. Immaginate di potrebbe fare questo e si aveva questo pezzo di codice:

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

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

dove sarebbe phpexit() salto per? Il blocco then di if (B) salta fuori da un blocco PHP, ma non si desidera passare a <b>Foo</b> da if (!A), giusto? Non avrebbe senso passare a un blocco then senza verificare la condizione.

As gd1 already showed, è possibile farlo con goto ma renderebbe il codice non strutturato. Faresti molto duro a te stesso (e ai futuri manutentori del tuo codice) per capire il flusso del tuo codice quando il tuo codice salta ovunque.

Nelle lingue di basso livello (ad es.assemblea) si solo con cui si lavora, ma nelle lingue superiori si astraggono quelle con strutture come if, for e while. Questi forniscono struttura intenzionalmente impedendoti di saltare ovunque desideri.

6

Se rispetti la cultura pop disadattato troppo e sentite il bisogno di adattarsi (! E ottenere popolare), ecco una soluzione senza goto:

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

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

Se questo è per niente, ma un esperimento, è stanno facendo male. Smettila di fare programmi orientati alle inclusioni mentre inizi a studiare OOP.

Bene ... si può sempre avvolgere il contenuto di <?php ?> nella funzione anonima;

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

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

};$f(); ?> 

<?php $f = function() { 

    echo 2; 

};$f(); ?> 

Questo funzionerebbe in PHP 5.3+. E se è necessario condividere la variabile, è possibile inserirli nello scope con l'istruzione use() nella definizione.

Ma ripeto:

Se si vuole fare qualcosa di simile in codice di produzione, si sta facendo male.

+0

il 'do {} while (0);' è più intelligente. Farlo con una chiusura è corretto, ma a) più lento e usando più memoria eb) non è così bello. (ma io non proroga: è corretto) – bwoebi

+0

Hmm .. Ora sono curioso. Le funzioni immediatamente definite (come '(function() {..})()') funzionano in PHP (come in Javascript), o c'è un errore di sintassi? – Izkata

+1

@Izkata, in effetti l'ho provato inizialmente, ma non ha funzionato. Parser parlava di parentesi inaspettate. –

0

ho incontrato diverse situazioni in cui il resto di un blocco di codice PHP deve essere saltato a causa di una condizione di errore (errore di connessione al database, input non valido, etc.). Come studente, il mio professore usa semplicemente die, che interrompe del tutto l'analisi del file, lasciando la pagina incompleta, senza il piè di pagina o anche i tag di chiusura HTML </body></html>. Anche quando c'è un errore, non c'è motivo di generare HTML non valido tagliando i tag di chiusura.

Ovviamente, un approccio puramente strutturato utilizza le dichiarazioni if e ciò è preferibile a goto nella maggior parte delle situazioni. Tuttavia, ritengo che se stai cercando di saltare fuori da un blocco di codice PHP, inserire ampi segmenti di codice in una struttura if/else è piuttosto inelegante e può effettivamente rendere il codice più difficile da comprendere rispetto semplicemente all'utilizzo di una dichiarazione goto che salta alla fine del blocco PHP, appena prima dello ?>, poiché diventa difficile ricordare che un intero gruppo di codici fa in effetti parte di un'istruzione condizionale oltre 50 righe sotto le linee if o elseif.

Tutti dicono che goto dichiarazioni sono male, ma ci sono usi validi per goto che rendono il codice più facile da capire, come saltare fuori delle strutture di controllo profondamente nidificate e saltare alla fine di un blocco di codice PHP (dato che nessun esiste un costrutto di linguaggio incorporato per farlo).

Un codice di costruzione come goto non è intrinsecamente malvagio. Si tratta di come lo si utilizza.