Comando GOTO in PHP?


5

Ho sentito dire che PHP sta pianificando l'introduzione di un comando "goto". Cosa dovrebbe fare?

Ho provato a cercare un po ', ma non ho trovato nulla di terribilmente descrittivo. Capisco che non sarà un comando "GOTO 10" ...

+1

Ed infatti è in PHP5. E quello che fa è "semplicemente goto". 04 mar. 102010-03-04 18:03:59

9

Non aggiungono un vero GOTO, ma estendono la parola chiave BREAK per utilizzare etichette statiche. Fondamentalmente, migliorerà la capacità di interrompere le istruzioni nidificate da a if. Ecco l'esempio 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 il GOTO "voce" era fuori, non c'era nulla per fermare alcuni ragazzi cattivi per propagare un ulteriore comefrom scherzo. Sii sulla punta dei piedi.

Consulta anche:

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

+4

Penso che sia davvero confuso, perché una rottura da sola salterà fuori dal ciclo for, non solo dall'istruzione if. 06 lug. 092009-07-06 14:41:05


3

Concesso, non sono un programmatore PHP, e non so quale sarà l'esatta implementazione di GOTO di PHP, ma qui è le mie conoscenze su GOTO:

GOTO è solo un'istruzione di controllo del flusso più esplicita come le altre. Supponiamo che tu abbia dei loop nidificati e devi solo trovare una cosa. È possibile inserire un'istruzione condizionale (o più) e quando le condizioni vengono soddisfatte correttamente, è possibile utilizzare un'istruzione GOTO per uscire da tutti i loop, (invece di avere un'istruzione 'break' ad ogni livello di nidificazione con un'istruzione condizionale . per ogni e sì, credo che il tradizionale implementazione è quello di avere le etichette nome che l'istruzione GOTO può saltare per nome si può fare qualcosa di simile:.

for(...) { 
    for (...) { 
     for (...) { 
     // some code 
     if (x) GOTO outside; 
     } 
    } 
} 
:outside 

si tratta di una semplice (e più efficiente) nell'attuazione . che senza istruzioni GOTO l'equivalente sarebbe:

for(...) { 
    for (...) { 
     for (...) { 
      // some code 
      if (x) break; 
     } 
     if(x) break; 
    } 
    if(x) break; 
} 

Nel secondo caso (che è pratica comune) ci sono thre e dichiarazioni condizionali, che è ovviamente più lento del semplice averne uno. Pertanto, per ragioni di ottimizzazione/semplificazione, è possibile utilizzare le istruzioni GOTO in cicli strettamente annidati.

  0

Non è necessario GOTO per questo motivo. Vedi la mia risposta per un modo più strutturato di esprimere l'interruzione dei loop che funziona sempre e introduce zero inefficienza. Goto per questo scopo è semplicemente stupido. (Non è una tua opinione.) 04 mar. 102010-03-04 18:05:27


0

E 'looks come se fosse attualmente in PHP 5.3, ma non è ancora completamente documentato. Da quello che posso dire condivide la sua sintassi goto con C, quindi dovrebbe essere facile da prendere e usare. Basta ricordare Dijkstra's warning e usarlo solo quando necessario.


0

@ steveth45

La mia regola è che se si hanno nidificato codice di più di 3 livelli di profondità, si sta facendo qualcosa di sbagliato .

Allora non c'è bisogno di preoccuparsi per l'utilizzo di più istruzioni break o goto: D

  0

Sono un po 'd'accordo, ma a volte più livelli di cicli annidati sono inevitabili e non dovrebbero essere derisi. 03 lug. 092009-07-03 09:27:05


0

Nell'esempio data dal steveth45 è possibile utilizzare una funzione invece:

function findItem(...) { 
    for (...) { 
    for (...) { 
     for (...) { 
     if (x) { 
      return theItem; 
     } 
     } 
    } 
    } 
} 

// no need for label now 
theItem = findItem(a, b, c); 

5

Sono sempre stupito a quanto incredibilmente stupidi sono i progettisti PHP. Se lo scopo di utilizzare GOTO è quello di rendere rottura di moltiplicare nidificate cicli più efficienti c'è un modo migliore: i blocchi di codice etichettati e rompere le dichiarazioni che possono fare riferimento le etichette:

a: for (...) { 
    b: for (...) { 
     c: for (...) { 
       ... 
       break a; 
      } 
     } 
    } 

Ora è è chiaro che loop/blocco per uscire, e l'uscita è strutturata; non è possibile ottenere codice spaghetti con questo come si può con le foto reali.

Questa è una vecchia, vecchia, vecchia idea. La progettazione delle strutture di controllo del flusso di controllo è stata risolta dagli anni '70 e la letteratura su tutto questo è stata scritta da tempo. Il teorema di Bohm-Jacopini ha mostrato che è possibile codificare qualsiasi cosa con la chiamata di funzione, se-then-else e while loop. In pratica, per uscire da blocchi profondamente annidati, la codifica di stile Bohm-Jacopini richiedeva ulteriori flag booleani ("imposta questo flag per uscire dal ciclo") che era una programmazione sgraziata e inefficiente (non vuoi bandiere nel tuo ciclo interno). Con if-then-else, vari loop (while, for) e blocco da break-to-labeled, è possibile codificare qualsiasi algoritmo senza perdita di efficienza . Perché la gente non legge la letteratura, invece è di copiare cosa ha fatto C? Grrr.

  0

Non è questa cosa _break-to-labeled-block_ che hai menzionato esattamente cosa viene proposto con questa nuova funzionalità PHP? Perdonami se ho torto 13 mar. 112011-03-13 15:23:38

  0

Quale nuova funzione? VAI A? GOTO ti porterà su un'etichetta collocata in una parte casuale del tuo codice. La break-to-label * only * consente le interruzioni dall'interno di un blocco all'uscita del blocco. 13 mar. 112011-03-13 16:06:25

  0

Beh, immagino che la cosa _break-to-label_ che hai menzionato sia ** esattamente ** che cosa si dice venga introdotta in php6. Non sta facendo rivivere GOTO. 13 mar. 112011-03-13 20:17:21

  0

@Felipe: questa discussione riguarda il fatto che GOTO è "nuovo". È già in PHP5 e funziona come ... GOTO, che è la mia lamentela. PHP6 potrebbe introdurre altre cose, forse anche un'interruzione progettata in modo intelligente, ma non era l'argomento qui. 13 mar. 112011-03-13 21:26:57

  0

+1 per la prima frase da solo. 16 mar. 122012-03-16 15:30:59


0

c'è un goto in php ->http://php.net/manual/en/control-structures.goto.php, ma io non lo uso, basta scrivere codice normale ...