2013-10-04 13 views
7

C'è un modo per definire l'etichetta globale (qualcosa come le variabili) per PHP goto, per poterlo utilizzare all'interno della dichiarazione di funzione. Voglio fare le seguenti operazioni:usa goto all'interno della funzione php

function myFunction() { 
    if (condition) { 
    goto someLine; 
    } 
} 


someLine: 
// .... 

myFunction(); 

quando uso questo codice si dice

PHP Fatal error: 'goto' to undefined label "someLine" 

So che non è consigliabile utilizzare goto dichiarazione. Ma ne ho bisogno nel mio caso. So che forse sempre ci sono alternative di goto, solo nel mio caso sarebbe rendere il codice un po 'più facile e comprensibile

+0

così si vuole saltare fuori della funzione? Questo non è possibile. Cosa stai cercando di ottenere? – Jim

+0

@Jim, ho bisogno di controllare le condizioni all'interno della funzione e in base a loro, vai alla linea specifica. Grazie – dav

+0

Cosa stai usando questo * per *? C'è quasi sempre un'alternativa all'utilizzo di un goto. – Jim

risposta

6

Non si può goto di fuori di una funzione credo: http://php.net/manual/en/control-structures.goto.php

citazione diretta: Questo è non un pieno goto illimitato. L'etichetta di destinazione deve essere all'interno dello stesso file e contesto, il che significa che non puoi saltare da una funzione o un metodo, né puoi saltarne uno.

Questo potrebbe essere dovuto al fatto che il php viene analizzato e saltare fuori da una funzione causerà una perdita di memoria o qualcosa del genere perché non è mai stato chiuso correttamente. Come tutti gli altri hanno detto sopra, in realtà non hai bisogno di un goto. Puoi solo restituire valori diversi dalla funzione e avere una condizione per ciascuno. Goto è solo una pessima pratica per la codifica moderna (accettabile se si utilizza il basic).

Esempio:

function foo(a) { 
    if (a==1) { 
     return 1; 
    } elseif (a==3) { 
     return 2; 
    } else { 
     return 3; 
    } 
} 

switch (foo(4)) { //easily replaceable with elseif chain 
    case 1: echo 'Foo was 1'; break; //These can be functions to other parts of the code 
    case 2: echo 'Foo was 3'; break; 
    case 3: echo 'Foo was not 1 or 3'; 
} 
2

Non c'è modo di saltare dentro o fuori di una funzione. Ma siccome dichiari di averne bisogno, ecco un percorso alternativo.

function myFunction() { 
    if (condition) { 
    return true; 
    } 
    return false; 
} 


someLine: 
// .... 

$func = myFunction(); 
if($func == true) goto someLine; 
+0

sì, in questo modo è l'alternativa che penso anche io, ma le condizioni della mia funzione sono un po 'complicate e usare la funzione goto inside renderebbe il codice più facile. Grazie – dav

+2

Non si tratta davvero di quanto "facile" sia il codice in questo caso. Non c'è davvero un'altra opzione oltre a programmare le cose nel modo giusto - il che significa NON usare goto. – BetaBlaze

2

Come precedentemente affermato, non è possibile. Per quanto riguarda "I need it", ne dubito fortemente. Qualunque sia il codice che hai a qualche riga: può essere facilmente trasformato in una funzione che puoi chiamare dall'altro, se necessario.

0

sì c'è un modo fintanto che la funzione è dichiarata sullo stesso file PHP o è incluso se su un altro script,

il modo migliore per passare a someline è quello di restituire quel codice goto del tuo amico in modo che, se la funzione è chiamato un valore di ritorno viene ricevuto .. spero che questo aiuti

function foo($b="30") 
{ 
$a=30; 
if($a==intval($b)) 
return "someline:goto 
someline"; 
} 

try{ 
eval(foo()); 
} 
catch(IOException $err) 
{ 
exit($err); 
} 

/*someline is somewhere here 
for example */ 
+0

non si può fare un goto da una funzione a una linea esterna a se stessa, ma si può invece restituire una valutazione o semplicemente restituire una stringa semplice return "goto someline" ma accertarsi di valutare la funzione chiamata come eval (foo()): where foo ritorna goto, penso che sia meglio provare a lavorare –