Comando GOTO in PHP?
-
09-06-2019 - |
Domanda
Ho sentito voci secondo cui PHP sta pianificando di introdurre un comando "goto".Cosa dovrebbe fare?
Ho provato a cercare un po', ma non ho trovato nulla di estremamente descrittivo.Capisco che non sarà un "GOTO 10
"-come comando...
Soluzione
Non aggiungono un vero GOTO, ma estendono la parola chiave BREAK per utilizzare etichette statiche.Fondamentalmente, migliorerà la capacità di uscire interruttore istruzioni if nidificate.Ecco l'esempio di concetto che ho trovato:
<?php
for ($i = 0; $i < 9; $i++) {
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
Naturalmente, una volta che la "voce" del GOTO si è diffusa, non c'era nulla che impedisse ad alcuni malvagi di diffonderne un'altra VIENI DA scherzo.Stai attento.
Guarda anche:
Altri suggerimenti
Sono sempre stupito di quanto siano incredibilmente stupidi i progettisti PHP.Se lo scopo di usare Gotos è quello di rendere più efficiente lo scoppio di loop nidificati multipli, c'è un modo migliore:Blocchi di codice etichettati e istruzioni di interruzione che possono fare riferimento alle etichette:
a: for (...) {
b: for (...) {
c: for (...) {
...
break a;
}
}
}
Ora è chiaro da quale loop/blocco uscire, e l'uscita è strutturata;con questo non puoi ottenere spaghetti code come puoi con i veri goto.
Questa è una vecchia, vecchia, vecchia idea.La progettazione di buone strutture di gestione del flusso di controllo è stata risolta dagli anni '70 e la letteratura su tutto ciò è da tempo scritta.Il teorema di Bohm-Jacopini ha mostrato che potresti codificare qualsiasi cosa con la chiamata di funzione, if-then-else e mentre i loop.In pratica, per uscire da blocchi profondamente nidificati, la codifica in stile bohm-jacopini ha richiesto bandiere booleane extra ("Imposta questa bandiera per uscire dal ciclo") che era una codifica goffa saggia e inefficiente (non vuoi tali bandiere nelle tue Loop interno).Con if-then-else, vari loop (mentre, per) e blocco di rottura, è possibile codificare qualsiasi algoritmo senza perdita di efficienza.Perché le persone non leggono la letteratura, invece di copiare ciò che C ha fatto?Grr.
Certo, non sono un programmatore PHP e non so come sarà l'esatta implementazione di GOTO in PHP, ma ecco la mia comprensione di GOTO:
GOTO è solo un'istruzione di controllo del flusso più esplicita come qualsiasi altra.Diciamo che hai dei loop nidificati e devi trovare solo una cosa.Puoi inserire un'istruzione condizionale (o più) e quando le condizioni sono soddisfatte correttamente, puoi utilizzare un'istruzione GOTO per uscire da tutti i cicli (invece di avere un'istruzione 'break' a ogni livello di nidificazione con un'istruzione condizionale per ciascuno.E sì, credo che l'implementazione tradizionale sia quella di avere etichette denominate a cui l'istruzione GOTO può passare per nome.Puoi fare qualcosa del genere:
for(...) {
for (...) {
for (...) {
// some code
if (x) GOTO outside;
}
}
}
:outside
Questa è un'implementazione più semplice (e più efficiente) rispetto a quella senza istruzioni GOTO.L'equivalente sarebbe:
for(...) {
for (...) {
for (...) {
// some code
if (x) break;
}
if(x) break;
}
if(x) break;
}
Nel secondo caso (che è una pratica comune) ci sono tre istruzioni condizionali, il che è ovviamente più lento che averne una sola.Quindi, per ragioni di ottimizzazione/semplificazione, potresti voler utilizzare le istruzioni GOTO in cicli strettamente annidati.
Nell'esempio fornito da steveth45 puoi invece usare una funzione:
function findItem(...) {
for (...) {
for (...) {
for (...) {
if (x) {
return theItem;
}
}
}
}
}
// no need for label now
theItem = findItem(a, b, c);
Esso sembra come se fosse attualmente in PHP 5.3, ma non è ancora completamente documentato.Da quello che posso dire, condivide la sintassi goto con C, quindi dovrebbe essere facile da imparare e utilizzare.Ricorda solo quello di Dijkstra avvertimento e usarlo solo quando necessario.
@steveth45
La mia regola empirica è che se hai un codice nidificato più di 3 livelli in profondità, stai facendo qualcosa di sbagliato.
Quindi non devi preoccuparti di utilizzare più istruzioni break o goto :D
c'è un goto
nel php -> http://php.net/manual/en/control-structures.goto.php, ma non lo userei, scrivo semplicemente codice normale...