Perché GOTO è stato incluso in PHP 5? [chiuso]

8

Ho scoperto qualche tempo fa che la parola chiave GOTO control era stata introdotta in PHP 5.3.0.

link

Perché è successo?

Quali sono gli obiettivi di progettazione linguistica alla base di questo?

La comunità di sviluppatori PHP l'ha richiesto?

    
posta Tulains Córdova 19.12.2012 - 21:37
fonte

3 risposte

22

La persona responsabile fornisce il motivo per aggiungerla in questo post del blog .

[T]he project I was working on (and may pick back up someday) was a workflow based site builder […] for making dynamic websites without knowing a programming language. You build up all the meta-information about how your site should run, then the site-builder “compiles” that into PHP code that’ll run on the actual server.

It can be done without GOTO, but the resulting logic for the particularly complex bits of business logic become much simpler with it.

Nella difesa di PHP, ti consente solo di passare alle etichette in un ambito limitato, il che limita il danno che può essere fatto.

(Si potrebbe anche sostenere che dato il modo in cui PHP ha apparentemente assorbito ogni costrutto da ogni linguaggio di programmazione mai inventato, l'aggiunta di goto era semplicemente inevitabile)

    
risposta data 19.12.2012 - 22:06
fonte
13

A un livello inferiore PHP aveva goto da PHP 4. Con PHP 4 l'interprete è stato rifatto e il motore Zend è stato introdotto, che include un compilatore che compila fino a "opcodes" di basso livello che vengono consegnati a un esecutore.

Su quel livello viene utilizzata un'operazione di salto per tutti if , switch o qualsiasi istruzione loop. Con PHP 5.3 è stato deciso di esportarlo sotto il nome di goto dopo una lunga discussione.

I motivi principali erano:

  • Può essere fatto senza alcun costo (lo abbiamo già internamente comunque)
  • Può essere d'aiuto durante la scrittura di generatori di codice
  • A volte può aiutare a ripulire il codice di gestione degli errori.

I primi due elementi potrebbero non aver bisogno di spiegazioni, e la terza parte riguarda situazioni come questa:

 function do() {
     $lock = $acquire_lock...)
     if (!do_something()) {
         goto cleanup
     }
     if (!do_more()) {
          goto cleanup;
     }
  cleanup:
  free_lock($lock);

Naturalmente in PHP ci sono poche situazioni di questo tipo, dato che PHP ha un sistema di raccolta dei rifiuti conteggiato di riferimento che renderà prevedibilmente libere tali variabili e risorse associate. Ciononostante esistono situazioni in cui gli sviluppatori hanno duplicato il codice di ripulitura più volte o hanno abusato di d do { } while (0); con break come goto di emulazione.

Per impedire l'uso improprio, l'implementazione è stata limitata in modo da non poter entrare nei loop. Quindi "l'abuso" nel modo del famoso dispositivo di Duff non sarà possibile.

Alla fine, PHP è stato sviluppato per risolvere i problemi, non ti protegge completamente dagli spari del tuo stesso piede, puoi abusare di molte funzioni in modo peggiore di questo goto limitato. Quindi, la conclusione è stata che ci sono casi limite in cui è utile e in grado di risolvere i problemi.

    
risposta data 19.12.2012 - 22:21
fonte
5

Si può scrivere codice cattivo in qualsiasi lingua. Avere goto nella lingua non significa che la lingua sia cattiva.

Considera le strutture esistenti in varie lingue: pausa , continue , next , ultimo , throw . Even switch Queste sono tutte forme di un go di calcolo che vanno da un livello di scope allo stesso livello o ad un livello superiore di scope.

Il problema con goto è quando entra in un livello più profondo di scope o salta i frame dello stack.

Si noterà l'Esempio 3 nel documento collegato dalla domanda:

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

Questo non funzionerà perché goto sta tentando di passare a un livello più profondo di scope.

Non c'è nulla di sbagliato in varie forme di goto limitato, essere la parola chiave chiamata goto o qualche altro nome di diramazione. Le alternative (brutti condizionali nei cicli for) possono spesso essere peggiori. Così com'è, usando goto semplifica il

Personalmente, non mi piace l'esempio dato come esempio # 1

<?php
goto a;
echo 'Foo';

a:
echo 'Bar';
?>

Tuttavia, questo non causa problemi con la lingua se non la necessità di applicare qualche forma di esperienza di apprendimento corporale allo sviluppatore che scrive intenzionalmente un codice come questo.

    
risposta data 19.12.2012 - 22:06
fonte