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...

È stato utile?

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:

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

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...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top